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 { Args } from '../CommonArgs';
15fb726d48Sopenharmony_ciimport { threadCallStackList } from '../utils/AllMemoryCache';
16fb726d48Sopenharmony_ciimport { filterDataByGroupLayer } from '../utils/DataFilter';
17fb726d48Sopenharmony_ciimport { TraficEnum } from '../utils/QueryEnum';
18fb726d48Sopenharmony_ci
19fb726d48Sopenharmony_ciexport const chartFuncDataSql = (args: Args): string => {
20fb726d48Sopenharmony_ci  return `
21fb726d48Sopenharmony_ci    select
22fb726d48Sopenharmony_ci        startTs,
23fb726d48Sopenharmony_ci        dur,
24fb726d48Sopenharmony_ci        ifnull(argsetid, -1) as argsetid,
25fb726d48Sopenharmony_ci        depth,
26fb726d48Sopenharmony_ci        id,
27fb726d48Sopenharmony_ci        max(dur2) as dur2,
28fb726d48Sopenharmony_ci        (startTs) / (${Math.floor((args.endNS - args.startNS) / args.width)}) + (depth * ${
29fb726d48Sopenharmony_ci    args.width
30fb726d48Sopenharmony_ci  })                           AS px
31fb726d48Sopenharmony_ci    from (
32fb726d48Sopenharmony_ci      select c.ts - ${args.recordStartNS} as startTs,
33fb726d48Sopenharmony_ci             c.dur as dur,
34fb726d48Sopenharmony_ci             case when (c.dur=-1 or c.dur is null ) then ${args.recordEndNS} else c.dur end                   as dur2,
35fb726d48Sopenharmony_ci             c.argsetid,
36fb726d48Sopenharmony_ci             c.depth,
37fb726d48Sopenharmony_ci             c.id                         as id
38fb726d48Sopenharmony_ci             --c.name                       as funName,
39fb726d48Sopenharmony_ci      from callstack C
40fb726d48Sopenharmony_ci      where startTs not null
41fb726d48Sopenharmony_ci        and c.cookie is null
42fb726d48Sopenharmony_ci        and c.callid in (select id from thread where tid=${args.tid}
43fb726d48Sopenharmony_ci        and ipid=${args.ipid})
44fb726d48Sopenharmony_ci        and startTs + dur2 >= ${Math.floor(args.startNS)}
45fb726d48Sopenharmony_ci        and startTs <= ${Math.floor(args.endNS)}
46fb726d48Sopenharmony_ci    )
47fb726d48Sopenharmony_ci    group by px;  
48fb726d48Sopenharmony_ci`;
49fb726d48Sopenharmony_ci};
50fb726d48Sopenharmony_ci
51fb726d48Sopenharmony_ciexport const chartFuncDataSqlMem = (args: Args): string => {
52fb726d48Sopenharmony_ci  return `select c.ts - ${args.recordStartNS} as startTs,
53fb726d48Sopenharmony_ci             c.dur                  as dur,
54fb726d48Sopenharmony_ci             ifnull(c.argsetid, -1) as argsetid,
55fb726d48Sopenharmony_ci             c.depth,
56fb726d48Sopenharmony_ci             c.id                         as id
57fb726d48Sopenharmony_ci      from callstack C
58fb726d48Sopenharmony_ci      where startTs not null
59fb726d48Sopenharmony_ci        and c.cookie is null
60fb726d48Sopenharmony_ci        and c.callid in (select id from thread where tid=${args.tid}
61fb726d48Sopenharmony_ci        and ipid=${args.ipid})`;
62fb726d48Sopenharmony_ci};
63fb726d48Sopenharmony_ciexport function funcDataReceiver(data: unknown, proc: Function): void {
64fb726d48Sopenharmony_ci  //@ts-ignore
65fb726d48Sopenharmony_ci  if (data.params.trafic === TraficEnum.Memory) {
66fb726d48Sopenharmony_ci    //@ts-ignore
67fb726d48Sopenharmony_ci    let key = `${data.params.tid}${data.params.ipid}`;
68fb726d48Sopenharmony_ci    if (!threadCallStackList.has(key)) {
69fb726d48Sopenharmony_ci      //@ts-ignore
70fb726d48Sopenharmony_ci      let list = proc(chartFuncDataSqlMem(data.params));
71fb726d48Sopenharmony_ci      for (let i = 0; i < list.length; i++) {
72fb726d48Sopenharmony_ci        if (list[i].dur === -1 || list[i].dur === null || list[i].dur === undefined) {
73fb726d48Sopenharmony_ci          list[i].nofinish = 1; //@ts-ignore
74fb726d48Sopenharmony_ci          let totalNs = data.params.recordEndNS - data.params.recordStartNS;
75fb726d48Sopenharmony_ci          list[i].dur = totalNs - list[i].startTs;
76fb726d48Sopenharmony_ci        } else {
77fb726d48Sopenharmony_ci          list[i].nofinish = 0;
78fb726d48Sopenharmony_ci        }
79fb726d48Sopenharmony_ci      }
80fb726d48Sopenharmony_ci      threadCallStackList.set(key, list);
81fb726d48Sopenharmony_ci    }
82fb726d48Sopenharmony_ci    //@ts-ignore
83fb726d48Sopenharmony_ci    let array = data.params.expand ? (threadCallStackList.get(key) || []) : arrayFoldHandler(key);
84fb726d48Sopenharmony_ci    let res = filterDataByGroupLayer(
85fb726d48Sopenharmony_ci      //@ts-ignore
86fb726d48Sopenharmony_ci      array,
87fb726d48Sopenharmony_ci      'depth',
88fb726d48Sopenharmony_ci      'startTs',
89fb726d48Sopenharmony_ci      'dur', //@ts-ignore
90fb726d48Sopenharmony_ci      data.params.startNS, //@ts-ignore
91fb726d48Sopenharmony_ci      data.params.endNS, //@ts-ignore
92fb726d48Sopenharmony_ci      data.params.width
93fb726d48Sopenharmony_ci    );
94fb726d48Sopenharmony_ci    //@ts-ignore
95fb726d48Sopenharmony_ci    arrayBufferHandler(data, res, true, array.length === 0);
96fb726d48Sopenharmony_ci  } else {
97fb726d48Sopenharmony_ci    //@ts-ignore
98fb726d48Sopenharmony_ci    let sql = chartFuncDataSql(data.params);
99fb726d48Sopenharmony_ci    let res = proc(sql); //@ts-ignore
100fb726d48Sopenharmony_ci    arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer, false);
101fb726d48Sopenharmony_ci  }
102fb726d48Sopenharmony_ci}
103fb726d48Sopenharmony_ci
104fb726d48Sopenharmony_ci//func泳道折叠时,过滤出depth为0的数据
105fb726d48Sopenharmony_cifunction arrayFoldHandler(key: unknown): unknown {
106fb726d48Sopenharmony_ci  //@ts-ignore
107fb726d48Sopenharmony_ci  return (threadCallStackList.get(key) || []).filter((it) => it.depth === 0 );
108fb726d48Sopenharmony_ci}
109fb726d48Sopenharmony_ci
110fb726d48Sopenharmony_cifunction arrayBufferHandler(data: unknown, res: unknown[], transfer: boolean, isEmpty: boolean): void {
111fb726d48Sopenharmony_ci  //@ts-ignore
112fb726d48Sopenharmony_ci  let startTs = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.startTs); //@ts-ignore
113fb726d48Sopenharmony_ci  let dur = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.dur); //@ts-ignore
114fb726d48Sopenharmony_ci  let argsetid = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.argsetid); //@ts-ignore
115fb726d48Sopenharmony_ci  let depth = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.depth); //@ts-ignore
116fb726d48Sopenharmony_ci  let id = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.id); //@ts-ignore
117fb726d48Sopenharmony_ci  let nofinish = new Uint8Array(transfer ? res.length : data.params.sharedArrayBuffers.nofinish);
118fb726d48Sopenharmony_ci  res.forEach((it, i) => {
119fb726d48Sopenharmony_ci    //@ts-ignore
120fb726d48Sopenharmony_ci    data.params.trafic === TraficEnum.ProtoBuffer && (it = it.processFuncData); //@ts-ignore
121fb726d48Sopenharmony_ci    startTs[i] = it.startTs; //@ts-ignore
122fb726d48Sopenharmony_ci    dur[i] = it.dur; //@ts-ignore
123fb726d48Sopenharmony_ci    argsetid[i] = it.argsetid; //@ts-ignore
124fb726d48Sopenharmony_ci    depth[i] = it.depth; //@ts-ignore
125fb726d48Sopenharmony_ci    id[i] = it.id; //@ts-ignore
126fb726d48Sopenharmony_ci    nofinish[i] = it.nofinish;
127fb726d48Sopenharmony_ci  });
128fb726d48Sopenharmony_ci  (self as unknown as Worker).postMessage(
129fb726d48Sopenharmony_ci    {
130fb726d48Sopenharmony_ci      //@ts-ignore
131fb726d48Sopenharmony_ci      id: data.id, //@ts-ignore
132fb726d48Sopenharmony_ci      action: data.action,
133fb726d48Sopenharmony_ci      results: transfer
134fb726d48Sopenharmony_ci        ? {
135fb726d48Sopenharmony_ci            startTs: startTs.buffer,
136fb726d48Sopenharmony_ci            dur: dur.buffer,
137fb726d48Sopenharmony_ci            argsetid: argsetid.buffer,
138fb726d48Sopenharmony_ci            depth: depth.buffer,
139fb726d48Sopenharmony_ci            id: id.buffer,
140fb726d48Sopenharmony_ci            nofinish: nofinish.buffer,
141fb726d48Sopenharmony_ci          }
142fb726d48Sopenharmony_ci        : {},
143fb726d48Sopenharmony_ci      len: res.length,
144fb726d48Sopenharmony_ci      transfer: transfer,
145fb726d48Sopenharmony_ci      isEmpty: isEmpty,
146fb726d48Sopenharmony_ci    },
147fb726d48Sopenharmony_ci    transfer ? [startTs.buffer, dur.buffer, argsetid.buffer, depth.buffer, id.buffer, nofinish.buffer] : []
148fb726d48Sopenharmony_ci  );
149fb726d48Sopenharmony_ci}
150