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 { clockList, hangList } from './utils/AllMemoryCache';
16fb726d48Sopenharmony_ciimport { Args } from './CommonArgs';
17fb726d48Sopenharmony_ci
18fb726d48Sopenharmony_ciexport const chartHangDataSql = (args: Args): string => `
19fb726d48Sopenharmony_ciSELECT
20fb726d48Sopenharmony_ci  c.id as id,
21fb726d48Sopenharmony_ci  c.ts - r.start_ts as startNS,
22fb726d48Sopenharmony_ci  c.dur as dur,
23fb726d48Sopenharmony_ci  t.tid as tid,
24fb726d48Sopenharmony_ci  t.name as tname,
25fb726d48Sopenharmony_ci  p.pid as pid,
26fb726d48Sopenharmony_ci  p.name as pname
27fb726d48Sopenharmony_ciFROM
28fb726d48Sopenharmony_ci  callstack c, trace_range r
29fb726d48Sopenharmony_ciLEFT JOIN thread t ON
30fb726d48Sopenharmony_ci  t.itid = c.callid
31fb726d48Sopenharmony_ciLEFT JOIN process p ON
32fb726d48Sopenharmony_ci  p.ipid = t.ipid
33fb726d48Sopenharmony_ciWHERE
34fb726d48Sopenharmony_ci  c.dur >= ${args.minDur}
35fb726d48Sopenharmony_ci  AND c.name LIKE 'H:Et:%'
36fb726d48Sopenharmony_ci  AND t.is_main_thread = 1
37fb726d48Sopenharmony_ci  AND p.pid = ${args.pid}
38fb726d48Sopenharmony_ci`.trim();
39fb726d48Sopenharmony_ci
40fb726d48Sopenharmony_ciexport interface HangSQLStruct {
41fb726d48Sopenharmony_ci  id: number;
42fb726d48Sopenharmony_ci  startNS: number;
43fb726d48Sopenharmony_ci  dur: number;
44fb726d48Sopenharmony_ci  tid: number;
45fb726d48Sopenharmony_ci  pid: number;
46fb726d48Sopenharmony_ci}
47fb726d48Sopenharmony_ci
48fb726d48Sopenharmony_ciexport function hangDataReceiver(data: unknown, proc: Function): void {
49fb726d48Sopenharmony_ci  // @ts-ignore
50fb726d48Sopenharmony_ci  if (data.params.trafic === TraficEnum.Memory) {
51fb726d48Sopenharmony_ci    let res: HangSQLStruct[];
52fb726d48Sopenharmony_ci    let list: HangSQLStruct[];
53fb726d48Sopenharmony_ci
54fb726d48Sopenharmony_ci    // @ts-ignore
55fb726d48Sopenharmony_ci    if (!hangList.has(data.params.pid)) {
56fb726d48Sopenharmony_ci      // @ts-ignore
57fb726d48Sopenharmony_ci      let sql = chartHangDataSql(data.params);
58fb726d48Sopenharmony_ci      list = proc(sql);
59fb726d48Sopenharmony_ci      // @ts-ignore
60fb726d48Sopenharmony_ci      hangList.set(data.params.pid, list);
61fb726d48Sopenharmony_ci    }
62fb726d48Sopenharmony_ci    else {
63fb726d48Sopenharmony_ci      // @ts-ignore
64fb726d48Sopenharmony_ci      list = hangList.get(data.params.pid) || [];
65fb726d48Sopenharmony_ci    }
66fb726d48Sopenharmony_ci
67fb726d48Sopenharmony_ci    // @ts-ignore
68fb726d48Sopenharmony_ci    if (data.params.queryAll) {
69fb726d48Sopenharmony_ci      res = list.filter(
70fb726d48Sopenharmony_ci        //@ts-ignore
71fb726d48Sopenharmony_ci        (it) => it.startNS + it.dur >= data.params.selectStartNS && it.startNS <= data.params.selectEndNS
72fb726d48Sopenharmony_ci      );
73fb726d48Sopenharmony_ci    }
74fb726d48Sopenharmony_ci    else {
75fb726d48Sopenharmony_ci      res = list;
76fb726d48Sopenharmony_ci    }
77fb726d48Sopenharmony_ci
78fb726d48Sopenharmony_ci    arrayBufferHandler(data, res, true);
79fb726d48Sopenharmony_ci  }
80fb726d48Sopenharmony_ci  else {
81fb726d48Sopenharmony_ci    // @ts-ignore
82fb726d48Sopenharmony_ci    let sql = chartHangDataSql(data.params);
83fb726d48Sopenharmony_ci    let res: HangSQLStruct[] = proc(sql);
84fb726d48Sopenharmony_ci    // @ts-ignore
85fb726d48Sopenharmony_ci    arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer);
86fb726d48Sopenharmony_ci  }
87fb726d48Sopenharmony_ci}
88fb726d48Sopenharmony_ci
89fb726d48Sopenharmony_cifunction arrayBufferHandler(data: unknown, res: HangSQLStruct[], transfer: boolean = true): void {
90fb726d48Sopenharmony_ci  // @ts-ignore
91fb726d48Sopenharmony_ci  let id = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.id);
92fb726d48Sopenharmony_ci  // @ts-ignore
93fb726d48Sopenharmony_ci  let startNS = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.startNS);
94fb726d48Sopenharmony_ci  // @ts-ignore
95fb726d48Sopenharmony_ci  let dur = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.dur);
96fb726d48Sopenharmony_ci  // @ts-ignore
97fb726d48Sopenharmony_ci  let tid = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.tid);
98fb726d48Sopenharmony_ci  // @ts-ignore
99fb726d48Sopenharmony_ci  let pid = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.pid);
100fb726d48Sopenharmony_ci  res.forEach((it, i) => {
101fb726d48Sopenharmony_ci    id[i] = it.id;
102fb726d48Sopenharmony_ci    startNS[i] = it.startNS;
103fb726d48Sopenharmony_ci    dur[i] = it.dur;
104fb726d48Sopenharmony_ci    tid[i] = it.tid;
105fb726d48Sopenharmony_ci    pid[i] = it.pid;
106fb726d48Sopenharmony_ci  });
107fb726d48Sopenharmony_ci
108fb726d48Sopenharmony_ci  let arg1 = {
109fb726d48Sopenharmony_ci    // @ts-ignore
110fb726d48Sopenharmony_ci    id: data.id,
111fb726d48Sopenharmony_ci    // @ts-ignore
112fb726d48Sopenharmony_ci    action: data.action,
113fb726d48Sopenharmony_ci    results: {
114fb726d48Sopenharmony_ci      id: id.buffer,
115fb726d48Sopenharmony_ci      startNS: startNS.buffer,
116fb726d48Sopenharmony_ci      dur: dur.buffer,
117fb726d48Sopenharmony_ci      tid: tid.buffer,
118fb726d48Sopenharmony_ci      pid: pid.buffer,
119fb726d48Sopenharmony_ci    },
120fb726d48Sopenharmony_ci    len: res.length,
121fb726d48Sopenharmony_ci    transfer: transfer,
122fb726d48Sopenharmony_ci  };
123fb726d48Sopenharmony_ci  let arg2 = [
124fb726d48Sopenharmony_ci    id.buffer,
125fb726d48Sopenharmony_ci    startNS.buffer,
126fb726d48Sopenharmony_ci    dur.buffer,
127fb726d48Sopenharmony_ci    tid.buffer,
128fb726d48Sopenharmony_ci    pid.buffer,
129fb726d48Sopenharmony_ci  ];
130fb726d48Sopenharmony_ci  (self as unknown as Worker).postMessage(
131fb726d48Sopenharmony_ci    arg1, arg2,
132fb726d48Sopenharmony_ci  );
133fb726d48Sopenharmony_ci}