1fb726d48Sopenharmony_ci// Copyright (c) 2021 Huawei Device Co., Ltd.
2fb726d48Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License");
3fb726d48Sopenharmony_ci// you may not use this file except in compliance with the License.
4fb726d48Sopenharmony_ci// You may obtain a copy of the License at
5fb726d48Sopenharmony_ci//
6fb726d48Sopenharmony_ci//     http://www.apache.org/licenses/LICENSE-2.0
7fb726d48Sopenharmony_ci//
8fb726d48Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software
9fb726d48Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS,
10fb726d48Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11fb726d48Sopenharmony_ci// See the License for the specific language governing permissions and
12fb726d48Sopenharmony_ci// limitations under the License.
13fb726d48Sopenharmony_ci
14fb726d48Sopenharmony_ciimport { TraficEnum } from '../utils/QueryEnum';
15fb726d48Sopenharmony_ciimport { filterDataByGroup } from '../utils/DataFilter';
16fb726d48Sopenharmony_ciimport { cpuFreqList } from '../utils/AllMemoryCache';
17fb726d48Sopenharmony_ciimport { Args } from '../CommonArgs';
18fb726d48Sopenharmony_ci
19fb726d48Sopenharmony_ciexport const chartCpuFreqDataSql = (args: Args): string => {
20fb726d48Sopenharmony_ci  const endNS = args.endNS;
21fb726d48Sopenharmony_ci  const startNS = args.startNS;
22fb726d48Sopenharmony_ci  const recordStartNS = args.recordStartNS;
23fb726d48Sopenharmony_ci  const cpu = args.cpu;
24fb726d48Sopenharmony_ci  const width = args.width;
25fb726d48Sopenharmony_ci  const recordEndNS = args.recordEndNS;
26fb726d48Sopenharmony_ci  return `select ${cpu} cpu,
27fb726d48Sopenharmony_ci                 value,
28fb726d48Sopenharmony_ci                 max(ifnull(dur, ${recordEndNS}-c.ts)) dur,
29fb726d48Sopenharmony_ci                 ts - ${recordStartNS} as startNs,
30fb726d48Sopenharmony_ci                 ((ts - ${recordStartNS}) / (${Math.floor((endNS - startNS) / width)})) AS px
31fb726d48Sopenharmony_ci          from measure c
32fb726d48Sopenharmony_ci          where c.filter_id = (select id from cpu_measure_filter t where t.cpu = ${cpu} 
33fb726d48Sopenharmony_ci          and (t.name = 'cpufreq' or t.name = 'cpu_frequency')
34fb726d48Sopenharmony_ci              limit 1)
35fb726d48Sopenharmony_ci            and startNs + ifnull(dur, ${recordEndNS}-c.ts) >= ${Math.floor(startNS)}
36fb726d48Sopenharmony_ci            and startNs <= ${Math.floor(endNS)}
37fb726d48Sopenharmony_ci          group by px
38fb726d48Sopenharmony_ci            union
39fb726d48Sopenharmony_ci            select ${cpu} cpu,
40fb726d48Sopenharmony_ci                 max(value),
41fb726d48Sopenharmony_ci                 dur dur,
42fb726d48Sopenharmony_ci                 ts - ${recordStartNS} as startNs,
43fb726d48Sopenharmony_ci                 ((ts - ${recordStartNS}) / (${Math.floor((endNS - startNS) / width)})) AS px
44fb726d48Sopenharmony_ci          from measure c
45fb726d48Sopenharmony_ci          where c.filter_id = (select id from cpu_measure_filter t where t.cpu = ${cpu} 
46fb726d48Sopenharmony_ci            and (t.name = 'cpufreq' or t.name = 'cpu_frequency')
47fb726d48Sopenharmony_ci              limit 1)
48fb726d48Sopenharmony_ci            and startNs + ifnull(dur, ${recordEndNS}-c.ts) >= ${Math.floor(startNS)}
49fb726d48Sopenharmony_ci            and startNs <= ${Math.floor(endNS)}
50fb726d48Sopenharmony_ci          group by px;
51fb726d48Sopenharmony_ci        ;`;
52fb726d48Sopenharmony_ci};
53fb726d48Sopenharmony_ci
54fb726d48Sopenharmony_ciexport const chartCpuFreqDataSqlMem = (args: Args): string => {
55fb726d48Sopenharmony_ci  const recordStartNS = args.recordStartNS;
56fb726d48Sopenharmony_ci  const cpu = args.cpu;
57fb726d48Sopenharmony_ci  const recordEndNS = args.recordEndNS;
58fb726d48Sopenharmony_ci  return `
59fb726d48Sopenharmony_ci      select cpu,
60fb726d48Sopenharmony_ci             value,
61fb726d48Sopenharmony_ci             ifnull(dur, ${recordEndNS} - c.ts) dur,
62fb726d48Sopenharmony_ci             ts - ${recordStartNS} as           startNs
63fb726d48Sopenharmony_ci      from measure c
64fb726d48Sopenharmony_ci               inner join
65fb726d48Sopenharmony_ci           cpu_measure_filter t
66fb726d48Sopenharmony_ci           on c.filter_id = t.id
67fb726d48Sopenharmony_ci      where (name = 'cpufreq' or name = 'cpu_frequency')
68fb726d48Sopenharmony_ci        and cpu = ${cpu};
69fb726d48Sopenharmony_ci  `;
70fb726d48Sopenharmony_ci};
71fb726d48Sopenharmony_ci
72fb726d48Sopenharmony_ciexport function cpuFreqDataReceiver(data: unknown, proc: Function): void {
73fb726d48Sopenharmony_ci  // @ts-ignore
74fb726d48Sopenharmony_ci  if (data.params.trafic === TraficEnum.Memory) {
75fb726d48Sopenharmony_ci    let res: unknown[];
76fb726d48Sopenharmony_ci    let list: unknown[];
77fb726d48Sopenharmony_ci    // @ts-ignore
78fb726d48Sopenharmony_ci    if (!cpuFreqList.has(data.params.cpu)) {
79fb726d48Sopenharmony_ci      // @ts-ignore
80fb726d48Sopenharmony_ci      list = proc(chartCpuFreqDataSqlMem(data.params));
81fb726d48Sopenharmony_ci      for (let i = 0; i < list.length; i++) {
82fb726d48Sopenharmony_ci        // @ts-ignore
83fb726d48Sopenharmony_ci        if (list[i].dur === -1 || list[i].dur === null || list[i].dur === undefined) {
84fb726d48Sopenharmony_ci          // @ts-ignore
85fb726d48Sopenharmony_ci          list[i].dur = data.params.recordEndNS - data.params.recordStartNS - list[i].startNs;
86fb726d48Sopenharmony_ci        }
87fb726d48Sopenharmony_ci      }
88fb726d48Sopenharmony_ci      // @ts-ignore
89fb726d48Sopenharmony_ci      cpuFreqList.set(data.params.cpu, list);
90fb726d48Sopenharmony_ci    } else {
91fb726d48Sopenharmony_ci      // @ts-ignore
92fb726d48Sopenharmony_ci      list = cpuFreqList.get(data.params.cpu) || [];
93fb726d48Sopenharmony_ci    }
94fb726d48Sopenharmony_ci    res = filterDataByGroup(
95fb726d48Sopenharmony_ci      list || [],
96fb726d48Sopenharmony_ci      'startNs',
97fb726d48Sopenharmony_ci      'dur',
98fb726d48Sopenharmony_ci      // @ts-ignore
99fb726d48Sopenharmony_ci      data.params.startNS,
100fb726d48Sopenharmony_ci      // @ts-ignore
101fb726d48Sopenharmony_ci      data.params.endNS,
102fb726d48Sopenharmony_ci      // @ts-ignore
103fb726d48Sopenharmony_ci      data.params.width,
104fb726d48Sopenharmony_ci      'value'
105fb726d48Sopenharmony_ci    );
106fb726d48Sopenharmony_ci    arrayBufferHandler(data, res, true);
107fb726d48Sopenharmony_ci  } else {
108fb726d48Sopenharmony_ci    // @ts-ignore
109fb726d48Sopenharmony_ci    let sql = chartCpuFreqDataSql(data.params);
110fb726d48Sopenharmony_ci    let res = proc(sql);
111fb726d48Sopenharmony_ci    // @ts-ignore
112fb726d48Sopenharmony_ci    arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer);
113fb726d48Sopenharmony_ci  }
114fb726d48Sopenharmony_ci}
115fb726d48Sopenharmony_ci
116fb726d48Sopenharmony_ciexport function arrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): void {
117fb726d48Sopenharmony_ci  // @ts-ignore
118fb726d48Sopenharmony_ci  let startNS = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.startNS);
119fb726d48Sopenharmony_ci  // @ts-ignore
120fb726d48Sopenharmony_ci  let dur = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.dur);
121fb726d48Sopenharmony_ci  // @ts-ignore
122fb726d48Sopenharmony_ci  let value = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.value);
123fb726d48Sopenharmony_ci  // @ts-ignore
124fb726d48Sopenharmony_ci  let cpu = new Uint8Array(transfer ? res.length : data.params.sharedArrayBuffers.cpu);
125fb726d48Sopenharmony_ci  res.forEach((it, i): void => {
126fb726d48Sopenharmony_ci    // @ts-ignore
127fb726d48Sopenharmony_ci    data.params.trafic === TraficEnum.ProtoBuffer && (it = it.cpuFreqData);
128fb726d48Sopenharmony_ci    // @ts-ignore
129fb726d48Sopenharmony_ci    startNS[i] = it.startNs;
130fb726d48Sopenharmony_ci    // @ts-ignore
131fb726d48Sopenharmony_ci    dur[i] = it.dur;
132fb726d48Sopenharmony_ci    // @ts-ignore
133fb726d48Sopenharmony_ci    cpu[i] = it.cpu;
134fb726d48Sopenharmony_ci    // @ts-ignore
135fb726d48Sopenharmony_ci    value[i] = it.value;
136fb726d48Sopenharmony_ci  });
137fb726d48Sopenharmony_ci  (self as unknown as Worker).postMessage(
138fb726d48Sopenharmony_ci    {
139fb726d48Sopenharmony_ci      // @ts-ignore
140fb726d48Sopenharmony_ci      id: data.id,
141fb726d48Sopenharmony_ci      // @ts-ignore
142fb726d48Sopenharmony_ci      action: data.action,
143fb726d48Sopenharmony_ci      results: transfer
144fb726d48Sopenharmony_ci        ? {
145fb726d48Sopenharmony_ci            startNS: startNS.buffer,
146fb726d48Sopenharmony_ci            dur: dur.buffer,
147fb726d48Sopenharmony_ci            value: value.buffer,
148fb726d48Sopenharmony_ci            cpu: cpu.buffer,
149fb726d48Sopenharmony_ci          }
150fb726d48Sopenharmony_ci        : {},
151fb726d48Sopenharmony_ci      len: res.length,
152fb726d48Sopenharmony_ci      transfer: transfer,
153fb726d48Sopenharmony_ci    },
154fb726d48Sopenharmony_ci    transfer ? [startNS.buffer, dur.buffer, value.buffer, cpu.buffer] : []
155fb726d48Sopenharmony_ci  );
156fb726d48Sopenharmony_ci}
157