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 { cpuList } from './utils/AllMemoryCache';
17fb726d48Sopenharmony_ciimport { Args } from './CommonArgs';
18fb726d48Sopenharmony_ci
19fb726d48Sopenharmony_ciexport const chartCpuDataProtoSql = (args: Args): string => {
20fb726d48Sopenharmony_ci  return `
21fb726d48Sopenharmony_ci      SELECT B.pid                                                                                        as processId,
22fb726d48Sopenharmony_ci             B.cpu,
23fb726d48Sopenharmony_ci             B.tid,
24fb726d48Sopenharmony_ci             B.itid                                                                                       as id,
25fb726d48Sopenharmony_ci             max(B.dur)                                                                                   AS dur,
26fb726d48Sopenharmony_ci             B.ts - ${args.recordStartNS}                                                                 AS startTime,
27fb726d48Sopenharmony_ci             ifnull(B.arg_setid, -1)                                                                      as argSetId,
28fb726d48Sopenharmony_ci             ((B.ts - ${args.recordStartNS}) / (${Math.floor((args.endNS - args.startNS) / args.width)})) AS px
29fb726d48Sopenharmony_ci      from thread_state AS B
30fb726d48Sopenharmony_ci      where B.itid is not null
31fb726d48Sopenharmony_ci        and B.cpu = ${args.cpu}
32fb726d48Sopenharmony_ci        and startTime + dur >= ${Math.floor(args.startNS)}
33fb726d48Sopenharmony_ci        and startTime <= ${Math.floor(args.endNS)}
34fb726d48Sopenharmony_ci      group by px;`;
35fb726d48Sopenharmony_ci};
36fb726d48Sopenharmony_ci
37fb726d48Sopenharmony_ciexport const chartCpuDataProtoSqlMem = (args: Args): string => {
38fb726d48Sopenharmony_ci  return `
39fb726d48Sopenharmony_ci      SELECT B.pid                        as processId,
40fb726d48Sopenharmony_ci             B.cpu,
41fb726d48Sopenharmony_ci             B.tid,
42fb726d48Sopenharmony_ci             B.itid                       as id,
43fb726d48Sopenharmony_ci             B.dur                        AS dur,
44fb726d48Sopenharmony_ci             B.ts - ${args.recordStartNS} AS startTime,
45fb726d48Sopenharmony_ci             ifnull(B.arg_setid, -1)      as argSetId
46fb726d48Sopenharmony_ci      from thread_state AS B
47fb726d48Sopenharmony_ci      where B.itid is not null
48fb726d48Sopenharmony_ci        and B.cpu = ${args.cpu};`;
49fb726d48Sopenharmony_ci};
50fb726d48Sopenharmony_ci
51fb726d48Sopenharmony_ciexport function cpuDataReceiver(data: unknown, proc: Function): void {
52fb726d48Sopenharmony_ci  // @ts-ignore
53fb726d48Sopenharmony_ci  if (data.params.trafic === TraficEnum.Memory) {
54fb726d48Sopenharmony_ci    let res: unknown[];
55fb726d48Sopenharmony_ci    let list: unknown[];
56fb726d48Sopenharmony_ci    // @ts-ignore
57fb726d48Sopenharmony_ci    if (!cpuList.has(data.params.cpu)) {
58fb726d48Sopenharmony_ci      // @ts-ignore
59fb726d48Sopenharmony_ci      list = proc(chartCpuDataProtoSqlMem(data.params));
60fb726d48Sopenharmony_ci      for (let i = 0; i < list.length; i++) {
61fb726d48Sopenharmony_ci        // @ts-ignore
62fb726d48Sopenharmony_ci        if (list[i].dur === -1 || list[i].dur === null || list[i].dur === undefined) {
63fb726d48Sopenharmony_ci          // @ts-ignore
64fb726d48Sopenharmony_ci          list[i].nofinish = 1;
65fb726d48Sopenharmony_ci          if (i === list.length - 1) {
66fb726d48Sopenharmony_ci            // @ts-ignore
67fb726d48Sopenharmony_ci            list[i].dur = data.params.endNS - list[i].startTime;
68fb726d48Sopenharmony_ci          } else {
69fb726d48Sopenharmony_ci            // @ts-ignore
70fb726d48Sopenharmony_ci            list[i].dur = list[i + 1].startTime - list[i].startTime;
71fb726d48Sopenharmony_ci          }
72fb726d48Sopenharmony_ci        } else {
73fb726d48Sopenharmony_ci          // @ts-ignore
74fb726d48Sopenharmony_ci          list[i].nofinish = 0;
75fb726d48Sopenharmony_ci        }
76fb726d48Sopenharmony_ci      }
77fb726d48Sopenharmony_ci      // @ts-ignore
78fb726d48Sopenharmony_ci      cpuList.set(data.params.cpu, list);
79fb726d48Sopenharmony_ci    } else {
80fb726d48Sopenharmony_ci      // @ts-ignore
81fb726d48Sopenharmony_ci      list = cpuList.get(data.params.cpu) || [];
82fb726d48Sopenharmony_ci    }
83fb726d48Sopenharmony_ci    // @ts-ignore
84fb726d48Sopenharmony_ci    res = filterDataByGroup(list || [], 'startTime', 'dur', data.params.startNS, data.params.endNS, data.params.width);
85fb726d48Sopenharmony_ci    arrayBufferHandler(data, res, true);
86fb726d48Sopenharmony_ci  } else {
87fb726d48Sopenharmony_ci    // @ts-ignore
88fb726d48Sopenharmony_ci    let sql = chartCpuDataProtoSql(data.params);
89fb726d48Sopenharmony_ci    let res = proc(sql);
90fb726d48Sopenharmony_ci    // @ts-ignore
91fb726d48Sopenharmony_ci    arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer);
92fb726d48Sopenharmony_ci  }
93fb726d48Sopenharmony_ci}
94fb726d48Sopenharmony_ci
95fb726d48Sopenharmony_ciexport function searchDataHandler(data: unknown): void {
96fb726d48Sopenharmony_ci  let res: unknown[] = [];
97fb726d48Sopenharmony_ci  // @ts-ignore
98fb726d48Sopenharmony_ci  let pidArr = data.params.pidArr as number[];
99fb726d48Sopenharmony_ci  // @ts-ignore
100fb726d48Sopenharmony_ci  let tidArr = data.params.tidArr as number[];
101fb726d48Sopenharmony_ci  for (let value of Array.from(cpuList.values())) {
102fb726d48Sopenharmony_ci    res.push(
103fb726d48Sopenharmony_ci      //@ts-ignore
104fb726d48Sopenharmony_ci      ...value.filter((cpuData) => pidArr.includes(cpuData.pid || cpuData.processId) || tidArr.includes(cpuData.tid))
105fb726d48Sopenharmony_ci    );
106fb726d48Sopenharmony_ci  }
107fb726d48Sopenharmony_ci  // @ts-ignore
108fb726d48Sopenharmony_ci  res.sort((dataA, dataB) => dataA.startTime - dataB.startTime);
109fb726d48Sopenharmony_ci  arrayBufferHandler(data, res, true);
110fb726d48Sopenharmony_ci}
111fb726d48Sopenharmony_ci
112fb726d48Sopenharmony_cifunction arrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): void {
113fb726d48Sopenharmony_ci  // @ts-ignore
114fb726d48Sopenharmony_ci  let startTime = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.startTime);
115fb726d48Sopenharmony_ci  // @ts-ignore
116fb726d48Sopenharmony_ci  let dur = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.dur);
117fb726d48Sopenharmony_ci  // @ts-ignore
118fb726d48Sopenharmony_ci  let tid = new Uint16Array(transfer ? res.length : data.params.sharedArrayBuffers.tid);
119fb726d48Sopenharmony_ci  // @ts-ignore
120fb726d48Sopenharmony_ci  let id = new Uint16Array(transfer ? res.length : data.params.sharedArrayBuffers.id);
121fb726d48Sopenharmony_ci  // @ts-ignore
122fb726d48Sopenharmony_ci  let processId = new Int16Array(transfer ? res.length : data.params.sharedArrayBuffers.processId);
123fb726d48Sopenharmony_ci  // @ts-ignore
124fb726d48Sopenharmony_ci  let cpu = new Uint8Array(transfer ? res.length : data.params.sharedArrayBuffers.cpu);
125fb726d48Sopenharmony_ci  // @ts-ignore
126fb726d48Sopenharmony_ci  let argSetId = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.argSetId);
127fb726d48Sopenharmony_ci  // @ts-ignore
128fb726d48Sopenharmony_ci  let nofinish = new Uint8Array(transfer ? res.length : data.params.sharedArrayBuffers.nofinish);
129fb726d48Sopenharmony_ci  res.forEach((it, i) => {
130fb726d48Sopenharmony_ci    // @ts-ignore
131fb726d48Sopenharmony_ci    data.params.trafic === TraficEnum.ProtoBuffer && (it = it.cpuData);
132fb726d48Sopenharmony_ci    // @ts-ignore
133fb726d48Sopenharmony_ci    startTime[i] = it.startTime;
134fb726d48Sopenharmony_ci    // @ts-ignore
135fb726d48Sopenharmony_ci    dur[i] = it.dur;
136fb726d48Sopenharmony_ci    // @ts-ignore
137fb726d48Sopenharmony_ci    tid[i] = it.tid;
138fb726d48Sopenharmony_ci    // @ts-ignore
139fb726d48Sopenharmony_ci    cpu[i] = it.cpu;
140fb726d48Sopenharmony_ci    // @ts-ignore
141fb726d48Sopenharmony_ci    id[i] = it.id;
142fb726d48Sopenharmony_ci    // @ts-ignore
143fb726d48Sopenharmony_ci    nofinish[i] = it.nofinish;
144fb726d48Sopenharmony_ci    // @ts-ignore
145fb726d48Sopenharmony_ci    processId[i] = it.pid || it.processId;
146fb726d48Sopenharmony_ci    // @ts-ignore
147fb726d48Sopenharmony_ci    argSetId[i] = it.argSetId;
148fb726d48Sopenharmony_ci  });
149fb726d48Sopenharmony_ci  (self as unknown as Worker).postMessage(
150fb726d48Sopenharmony_ci    {
151fb726d48Sopenharmony_ci      // @ts-ignore
152fb726d48Sopenharmony_ci      id: data.id,
153fb726d48Sopenharmony_ci      // @ts-ignore
154fb726d48Sopenharmony_ci      action: data.action,
155fb726d48Sopenharmony_ci      results: transfer
156fb726d48Sopenharmony_ci        ? {
157fb726d48Sopenharmony_ci            startTime: startTime.buffer,
158fb726d48Sopenharmony_ci            dur: dur.buffer,
159fb726d48Sopenharmony_ci            tid: tid.buffer,
160fb726d48Sopenharmony_ci            id: id.buffer,
161fb726d48Sopenharmony_ci            processId: processId.buffer,
162fb726d48Sopenharmony_ci            cpu: cpu.buffer,
163fb726d48Sopenharmony_ci            argSetID: argSetId.buffer,
164fb726d48Sopenharmony_ci            nofinish: nofinish.buffer,
165fb726d48Sopenharmony_ci          }
166fb726d48Sopenharmony_ci        : {},
167fb726d48Sopenharmony_ci      len: res.length,
168fb726d48Sopenharmony_ci      transfer: transfer,
169fb726d48Sopenharmony_ci    },
170fb726d48Sopenharmony_ci    transfer
171fb726d48Sopenharmony_ci      ? [
172fb726d48Sopenharmony_ci          startTime.buffer,
173fb726d48Sopenharmony_ci          dur.buffer,
174fb726d48Sopenharmony_ci          tid.buffer,
175fb726d48Sopenharmony_ci          id.buffer,
176fb726d48Sopenharmony_ci          processId.buffer,
177fb726d48Sopenharmony_ci          cpu.buffer,
178fb726d48Sopenharmony_ci          argSetId.buffer,
179fb726d48Sopenharmony_ci          nofinish.buffer,
180fb726d48Sopenharmony_ci        ]
181fb726d48Sopenharmony_ci      : []
182fb726d48Sopenharmony_ci  );
183fb726d48Sopenharmony_ci}
184