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_ciimport { QueryEnum, TraficEnum } from '../utils/QueryEnum';
14fb726d48Sopenharmony_ciimport { threadPool } from '../../SqlLite';
15fb726d48Sopenharmony_ciimport { TraceRow } from '../../../component/trace/base/TraceRow';
16fb726d48Sopenharmony_ciimport { SpSystemTrace } from '../../../component/SpSystemTrace';
17fb726d48Sopenharmony_ci
18fb726d48Sopenharmony_ciexport function hiperfCallChartDataSender(
19fb726d48Sopenharmony_ci  // @ts-ignore
20fb726d48Sopenharmony_ci  row: TraceRow<unknown>,
21fb726d48Sopenharmony_ci  setting: {
22fb726d48Sopenharmony_ci    startTime: number;
23fb726d48Sopenharmony_ci    eventTypeId: number;
24fb726d48Sopenharmony_ci    type: number;
25fb726d48Sopenharmony_ci    id: number;
26fb726d48Sopenharmony_ci  }
27fb726d48Sopenharmony_ci): Promise<unknown> {
28fb726d48Sopenharmony_ci  return new Promise((resolve, reject) => {
29fb726d48Sopenharmony_ci    threadPool.submitProto(
30fb726d48Sopenharmony_ci      QueryEnum.HiperfCallChart,
31fb726d48Sopenharmony_ci      {
32fb726d48Sopenharmony_ci        startNS: TraceRow.range?.startNS || 0,
33fb726d48Sopenharmony_ci        endNS: TraceRow.range?.endNS || 0,
34fb726d48Sopenharmony_ci        totalNS: (TraceRow.range?.endNS || 0) - (TraceRow.range?.startNS || 0),
35fb726d48Sopenharmony_ci        frame: row.frame,
36fb726d48Sopenharmony_ci        expand: row.funcExpand,
37fb726d48Sopenharmony_ci        isComplete: row.isComplete,
38fb726d48Sopenharmony_ci        startTime: setting.startTime,
39fb726d48Sopenharmony_ci        eventTypeId: setting.eventTypeId,
40fb726d48Sopenharmony_ci        type: setting.type,
41fb726d48Sopenharmony_ci        id: setting.id,
42fb726d48Sopenharmony_ci      },
43fb726d48Sopenharmony_ci      (res: unknown, len: number): void => {
44fb726d48Sopenharmony_ci        resolve(arrayBufferHandler(res, len));
45fb726d48Sopenharmony_ci      }
46fb726d48Sopenharmony_ci    );
47fb726d48Sopenharmony_ci  });
48fb726d48Sopenharmony_ci}
49fb726d48Sopenharmony_ci
50fb726d48Sopenharmony_ciexport function hiperfCallStackCacheSender(): Promise<unknown> {
51fb726d48Sopenharmony_ci  return new Promise((resolve, reject) => {
52fb726d48Sopenharmony_ci    threadPool.submitProto(
53fb726d48Sopenharmony_ci      QueryEnum.HiperfCallStack,
54fb726d48Sopenharmony_ci      {
55fb726d48Sopenharmony_ci        recordStartNS: window.recordStartNS,
56fb726d48Sopenharmony_ci        isCache: true,
57fb726d48Sopenharmony_ci        trafic: TraficEnum.TransferArrayBuffer,
58fb726d48Sopenharmony_ci      },
59fb726d48Sopenharmony_ci      (res: unknown, len: number): void => {
60fb726d48Sopenharmony_ci        resolve('ok');
61fb726d48Sopenharmony_ci      }
62fb726d48Sopenharmony_ci    );
63fb726d48Sopenharmony_ci  });
64fb726d48Sopenharmony_ci}
65fb726d48Sopenharmony_ci
66fb726d48Sopenharmony_ciexport function hiperfCallChartDataCacheSender(): Promise<unknown> {
67fb726d48Sopenharmony_ci  return new Promise((resolve, reject) => {
68fb726d48Sopenharmony_ci    threadPool.submitProto(
69fb726d48Sopenharmony_ci      QueryEnum.HiperfCallChart,
70fb726d48Sopenharmony_ci      {
71fb726d48Sopenharmony_ci        recordStartNS: window.recordStartNS,
72fb726d48Sopenharmony_ci        recordEndNS: window.recordEndNS,
73fb726d48Sopenharmony_ci        trafic: TraficEnum.TransferArrayBuffer,
74fb726d48Sopenharmony_ci        isCache: true,
75fb726d48Sopenharmony_ci      },
76fb726d48Sopenharmony_ci      (res: unknown, len: number): void => {
77fb726d48Sopenharmony_ci        resolve('ok');
78fb726d48Sopenharmony_ci      }
79fb726d48Sopenharmony_ci    );
80fb726d48Sopenharmony_ci  });
81fb726d48Sopenharmony_ci}
82fb726d48Sopenharmony_ci
83fb726d48Sopenharmony_cifunction arrayBufferHandler(
84fb726d48Sopenharmony_ci  res: unknown,
85fb726d48Sopenharmony_ci  len: number
86fb726d48Sopenharmony_ci): {
87fb726d48Sopenharmony_ci  maxDepth: unknown;
88fb726d48Sopenharmony_ci  dataList: unknown[];
89fb726d48Sopenharmony_ci} {
90fb726d48Sopenharmony_ci  // @ts-ignore
91fb726d48Sopenharmony_ci  let startTs = new Float64Array(res.startTs);
92fb726d48Sopenharmony_ci  // @ts-ignore
93fb726d48Sopenharmony_ci  let dur = new Float64Array(res.dur);
94fb726d48Sopenharmony_ci  // @ts-ignore
95fb726d48Sopenharmony_ci  let depth = new Int32Array(res.depth);
96fb726d48Sopenharmony_ci  // @ts-ignore
97fb726d48Sopenharmony_ci  let eventCount = new Int32Array(res.eventCount);
98fb726d48Sopenharmony_ci  // @ts-ignore
99fb726d48Sopenharmony_ci  let symbolId = new Int32Array(res.symbolId);
100fb726d48Sopenharmony_ci  // @ts-ignore
101fb726d48Sopenharmony_ci  let fileId = new Int32Array(res.fileId);
102fb726d48Sopenharmony_ci  // @ts-ignore
103fb726d48Sopenharmony_ci  let callchainId = new Int32Array(res.callchainId);
104fb726d48Sopenharmony_ci  // @ts-ignore
105fb726d48Sopenharmony_ci  let selfDur = new Int32Array(res.selfDur);
106fb726d48Sopenharmony_ci  // @ts-ignore
107fb726d48Sopenharmony_ci  let name = new Int32Array(res.name);
108fb726d48Sopenharmony_ci  let outArr: unknown[] = [];
109fb726d48Sopenharmony_ci  for (let i = 0; i < len; i++) {
110fb726d48Sopenharmony_ci    outArr.push({
111fb726d48Sopenharmony_ci      startTime: startTs[i],
112fb726d48Sopenharmony_ci      totalTime: dur[i],
113fb726d48Sopenharmony_ci      endTime: startTs[i] + dur[i],
114fb726d48Sopenharmony_ci      depth: depth[i],
115fb726d48Sopenharmony_ci      eventCount: eventCount[i],
116fb726d48Sopenharmony_ci      fileId: fileId[i],
117fb726d48Sopenharmony_ci      symbolId: symbolId[i],
118fb726d48Sopenharmony_ci      callchain_id: callchainId[i],
119fb726d48Sopenharmony_ci      selfDur: selfDur[i],
120fb726d48Sopenharmony_ci      name: SpSystemTrace.DATA_DICT.get(name[i]),
121fb726d48Sopenharmony_ci    } as unknown);
122fb726d48Sopenharmony_ci  }
123fb726d48Sopenharmony_ci  return {
124fb726d48Sopenharmony_ci    // @ts-ignore
125fb726d48Sopenharmony_ci    maxDepth: res.maxDepth,
126fb726d48Sopenharmony_ci    dataList: outArr,
127fb726d48Sopenharmony_ci  };
128fb726d48Sopenharmony_ci}
129