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 { filterDataByLayer } from '../utils/DataFilter';
16fb726d48Sopenharmony_ciimport { processList } from '../utils/AllMemoryCache';
17fb726d48Sopenharmony_ciimport { Args } from '../CommonArgs';
18fb726d48Sopenharmony_ci
19fb726d48Sopenharmony_ciconst sqlNormal = (args: Args): string => {
20fb726d48Sopenharmony_ci  return `select ta.cpu,                                                            
21fb726d48Sopenharmony_ci                 max(dur)  as dur,
22fb726d48Sopenharmony_ci                 ts - ${args.recordStartNS} as startTime,
23fb726d48Sopenharmony_ci                 ((ts - ${args.recordStartNS}) / (${Math.floor(
24fb726d48Sopenharmony_ci    (args.endNS - args.startNS) / args.width
25fb726d48Sopenharmony_ci  )})) + (ta.cpu * ${args.width}) AS px
26fb726d48Sopenharmony_ci          from thread_state ta
27fb726d48Sopenharmony_ci          where ta.cpu is not null
28fb726d48Sopenharmony_ci            and pid = ${args.pid}
29fb726d48Sopenharmony_ci            and startTime + dur >= ${Math.floor(args.startNS)}
30fb726d48Sopenharmony_ci            and startTime <= ${Math.floor(args.endNS)}
31fb726d48Sopenharmony_ci          group by px;`;
32fb726d48Sopenharmony_ci};
33fb726d48Sopenharmony_ci
34fb726d48Sopenharmony_ciconst sqlMem = (args: Args): string => {
35fb726d48Sopenharmony_ci  return `select ta.cpu,
36fb726d48Sopenharmony_ci                 dur                        as dur,
37fb726d48Sopenharmony_ci                 ts - ${args.recordStartNS} as startTime
38fb726d48Sopenharmony_ci          from thread_state ta
39fb726d48Sopenharmony_ci          where ta.cpu is not null
40fb726d48Sopenharmony_ci            and pid = ${args.pid};`;
41fb726d48Sopenharmony_ci};
42fb726d48Sopenharmony_ci
43fb726d48Sopenharmony_ciexport function processDataReceiver(data: unknown, proc: Function): void {
44fb726d48Sopenharmony_ci  //@ts-ignore
45fb726d48Sopenharmony_ci  if (data.params.trafic === TraficEnum.Memory) {
46fb726d48Sopenharmony_ci    //@ts-ignore
47fb726d48Sopenharmony_ci    if (!processList.has(data.params.pid)) {
48fb726d48Sopenharmony_ci      //@ts-ignore
49fb726d48Sopenharmony_ci      processList.set(data.params.pid, proc(sqlMem(data.params)));
50fb726d48Sopenharmony_ci    }
51fb726d48Sopenharmony_ci    let res = filterDataByLayer(
52fb726d48Sopenharmony_ci      //@ts-ignore
53fb726d48Sopenharmony_ci      processList.get(data.params.pid) || [],
54fb726d48Sopenharmony_ci      'cpu',
55fb726d48Sopenharmony_ci      'startTime',
56fb726d48Sopenharmony_ci      'dur', //@ts-ignore
57fb726d48Sopenharmony_ci      data.params.startNS, //@ts-ignore
58fb726d48Sopenharmony_ci      data.params.endNS, //@ts-ignore
59fb726d48Sopenharmony_ci      data.params.width
60fb726d48Sopenharmony_ci    );
61fb726d48Sopenharmony_ci    arrayBufferHandler(data, res, true);
62fb726d48Sopenharmony_ci    return;
63fb726d48Sopenharmony_ci  } else {
64fb726d48Sopenharmony_ci    //@ts-ignore
65fb726d48Sopenharmony_ci    let transfer = data.params.trafic !== TraficEnum.SharedArrayBuffer; //@ts-ignore
66fb726d48Sopenharmony_ci    let sql = sqlNormal(data.params);
67fb726d48Sopenharmony_ci    let res: unknown[] = proc(sql);
68fb726d48Sopenharmony_ci    arrayBufferHandler(data, res, transfer);
69fb726d48Sopenharmony_ci  }
70fb726d48Sopenharmony_ci}
71fb726d48Sopenharmony_ci
72fb726d48Sopenharmony_cifunction arrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): void {
73fb726d48Sopenharmony_ci  //@ts-ignore
74fb726d48Sopenharmony_ci  let startTime = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.startTime); //@ts-ignore
75fb726d48Sopenharmony_ci  let dur = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.dur); //@ts-ignore
76fb726d48Sopenharmony_ci  let cpu = new Uint8Array(transfer ? res.length : data.params.sharedArrayBuffers.cpu);
77fb726d48Sopenharmony_ci  res.forEach((it, i) => {
78fb726d48Sopenharmony_ci    //@ts-ignore
79fb726d48Sopenharmony_ci    data.params.trafic === TraficEnum.ProtoBuffer && (it = it.processData); //@ts-ignore
80fb726d48Sopenharmony_ci    startTime[i] = it.startTime; //@ts-ignore
81fb726d48Sopenharmony_ci    dur[i] = it.dur; //@ts-ignore
82fb726d48Sopenharmony_ci    cpu[i] = it.cpu;
83fb726d48Sopenharmony_ci  });
84fb726d48Sopenharmony_ci  (self as unknown as Worker).postMessage(
85fb726d48Sopenharmony_ci    {
86fb726d48Sopenharmony_ci      //@ts-ignore
87fb726d48Sopenharmony_ci      id: data.id, //@ts-ignore
88fb726d48Sopenharmony_ci      action: data.action,
89fb726d48Sopenharmony_ci      results: transfer
90fb726d48Sopenharmony_ci        ? {
91fb726d48Sopenharmony_ci            startTime: startTime.buffer,
92fb726d48Sopenharmony_ci            dur: dur.buffer,
93fb726d48Sopenharmony_ci            cpu: cpu.buffer,
94fb726d48Sopenharmony_ci          }
95fb726d48Sopenharmony_ci        : {},
96fb726d48Sopenharmony_ci      len: res.length,
97fb726d48Sopenharmony_ci      transfer: transfer,
98fb726d48Sopenharmony_ci    },
99fb726d48Sopenharmony_ci    transfer ? [startTime.buffer, dur.buffer, cpu.buffer] : []
100fb726d48Sopenharmony_ci  );
101fb726d48Sopenharmony_ci}
102