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 { TraficEnum } from '../utils/QueryEnum';
16fb726d48Sopenharmony_ci
17fb726d48Sopenharmony_ciexport const chartHiperfCpuData10MSProtoSql = (args: Args): string => {
18fb726d48Sopenharmony_ci  return `select 
19fb726d48Sopenharmony_ci                 startNS as startNS,
20fb726d48Sopenharmony_ci                 max(event_count) as eventCount,
21fb726d48Sopenharmony_ci                 sample_count as sampleCount,
22fb726d48Sopenharmony_ci                 event_type_id as eventTypeId,
23fb726d48Sopenharmony_ci                 callchain_id as callchainId,
24fb726d48Sopenharmony_ci                 (startNS / (${Math.floor((args.endNS - args.startNS) / args.width)})) AS px
25fb726d48Sopenharmony_ci          from (select s.callchain_id,
26fb726d48Sopenharmony_ci                       (s.timestamp_trace - ${args.recordStartNS}) / 10000000 * 10000000 startNS,
27fb726d48Sopenharmony_ci                       sum(event_count)                                                  event_count,
28fb726d48Sopenharmony_ci                       count(event_count)                                                sample_count,
29fb726d48Sopenharmony_ci                       event_type_id
30fb726d48Sopenharmony_ci                from perf_sample s
31fb726d48Sopenharmony_ci                where s.thread_id != 0 ${args.cpu >= 0 ? 'and cpu_id =' + args.cpu : ''} ${
32fb726d48Sopenharmony_ci    args.drawType >= 0 ? 'and event_type_id =' + args.drawType : ''
33fb726d48Sopenharmony_ci  }
34fb726d48Sopenharmony_ci                group by startNS)
35fb726d48Sopenharmony_ci          where startNS + 10000000 >= ${Math.floor(args.startNS)}
36fb726d48Sopenharmony_ci            and startNS <= ${Math.floor(args.endNS)}
37fb726d48Sopenharmony_ci          group by px;`;
38fb726d48Sopenharmony_ci};
39fb726d48Sopenharmony_ciexport const chartHiperfCpuDataProtoSql = (args: Args): string => {
40fb726d48Sopenharmony_ci  return `select 
41fb726d48Sopenharmony_ci                 (s.timestamp_trace - ${args.recordStartNS})          startNS,
42fb726d48Sopenharmony_ci                 event_count as eventCount,
43fb726d48Sopenharmony_ci                 1 as sampleCount,
44fb726d48Sopenharmony_ci                 event_type_id as eventTypeId,
45fb726d48Sopenharmony_ci                 s.callchain_id as callchainId,
46fb726d48Sopenharmony_ci                 (s.timestamp_trace - ${args.recordStartNS}) / (${Math.floor(
47fb726d48Sopenharmony_ci    (args.endNS - args.startNS) / args.width
48fb726d48Sopenharmony_ci  )}) AS      px
49fb726d48Sopenharmony_ci          from perf_sample s
50fb726d48Sopenharmony_ci          where s.thread_id != 0 ${args.cpu >= 0 ? 'and cpu_id =' + args.cpu : ''} ${
51fb726d48Sopenharmony_ci    args.drawType >= 0 ? 'and event_type_id =' + args.drawType : ''
52fb726d48Sopenharmony_ci  }
53fb726d48Sopenharmony_ci            and startNS >= ${Math.floor(args.startNS)}
54fb726d48Sopenharmony_ci            and startNS <= ${Math.floor(args.endNS)}
55fb726d48Sopenharmony_ci          group by px;
56fb726d48Sopenharmony_ci  `;
57fb726d48Sopenharmony_ci};
58fb726d48Sopenharmony_ci
59fb726d48Sopenharmony_ciexport function hiperfCpuDataReceiver(data: unknown, proc: Function): void {
60fb726d48Sopenharmony_ci  let sql: string;
61fb726d48Sopenharmony_ci  // @ts-ignore
62fb726d48Sopenharmony_ci  if (data.params.scale > 30_000_000) {
63fb726d48Sopenharmony_ci    // @ts-ignore
64fb726d48Sopenharmony_ci    sql = chartHiperfCpuData10MSProtoSql(data.params);
65fb726d48Sopenharmony_ci  } else {
66fb726d48Sopenharmony_ci    // @ts-ignore
67fb726d48Sopenharmony_ci    sql = chartHiperfCpuDataProtoSql(data.params);
68fb726d48Sopenharmony_ci  }
69fb726d48Sopenharmony_ci  let res = proc(sql);
70fb726d48Sopenharmony_ci  // @ts-ignore
71fb726d48Sopenharmony_ci  arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer);
72fb726d48Sopenharmony_ci}
73fb726d48Sopenharmony_ci
74fb726d48Sopenharmony_cifunction arrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): void {
75fb726d48Sopenharmony_ci  // @ts-ignore
76fb726d48Sopenharmony_ci  let maxCpuCount = data.params.maxCpuCount;
77fb726d48Sopenharmony_ci  // @ts-ignore
78fb726d48Sopenharmony_ci  let intervalPerf = data.params.intervalPerf;
79fb726d48Sopenharmony_ci  // @ts-ignore
80fb726d48Sopenharmony_ci  let usage = data.params.drawType === -2;
81fb726d48Sopenharmony_ci  let perfCpu = new PerfCpu(data, transfer, res.length);
82fb726d48Sopenharmony_ci  let maxEventCount = Math.max(
83fb726d48Sopenharmony_ci    ...res.map((it) => {
84fb726d48Sopenharmony_ci      // @ts-ignore
85fb726d48Sopenharmony_ci      data.params.trafic === TraficEnum.ProtoBuffer && (it = it.hiperfData);
86fb726d48Sopenharmony_ci      // @ts-ignore
87fb726d48Sopenharmony_ci      return it.eventCount;
88fb726d48Sopenharmony_ci    })
89fb726d48Sopenharmony_ci  );
90fb726d48Sopenharmony_ci  res.forEach((it, i) => {
91fb726d48Sopenharmony_ci    // @ts-ignore
92fb726d48Sopenharmony_ci    data.params.trafic === TraficEnum.ProtoBuffer && (it = it.hiperfData);
93fb726d48Sopenharmony_ci    // @ts-ignore
94fb726d48Sopenharmony_ci    perfCpu.startNS[i] = it.startNS || it.startNs; //startNS
95fb726d48Sopenharmony_ci    // @ts-ignore
96fb726d48Sopenharmony_ci    perfCpu.eventCount[i] = it.eventCount; //event_count
97fb726d48Sopenharmony_ci    // @ts-ignore
98fb726d48Sopenharmony_ci    perfCpu.sampleCount[i] = it.sampleCount; //sample_count
99fb726d48Sopenharmony_ci    // @ts-ignore
100fb726d48Sopenharmony_ci    perfCpu.eventTypeId[i] = it.eventTypeId; //event_type_id
101fb726d48Sopenharmony_ci    // @ts-ignore
102fb726d48Sopenharmony_ci    perfCpu.callChainId[i] = it.callchainId; //callchain_id
103fb726d48Sopenharmony_ci    if (usage) {
104fb726d48Sopenharmony_ci      if (maxCpuCount === -1) {
105fb726d48Sopenharmony_ci        // @ts-ignore
106fb726d48Sopenharmony_ci        perfCpu.height[i] = Math.floor((it.sampleCount / (10 / intervalPerf)) * 40);
107fb726d48Sopenharmony_ci      } else {
108fb726d48Sopenharmony_ci        // @ts-ignore
109fb726d48Sopenharmony_ci        perfCpu.height[i] = Math.floor((it.sampleCount / (10 / intervalPerf) / maxCpuCount) * 40);
110fb726d48Sopenharmony_ci      }
111fb726d48Sopenharmony_ci    } else {
112fb726d48Sopenharmony_ci      // @ts-ignore
113fb726d48Sopenharmony_ci      perfCpu.height[i] = Math.floor((it.eventCount / maxEventCount) * 40);
114fb726d48Sopenharmony_ci    }
115fb726d48Sopenharmony_ci  });
116fb726d48Sopenharmony_ci  postPerfCpuMessage(data, transfer, perfCpu, res.length);
117fb726d48Sopenharmony_ci}
118fb726d48Sopenharmony_cifunction postPerfCpuMessage(data: unknown, transfer: boolean, perfCpu: PerfCpu, len: number): void {
119fb726d48Sopenharmony_ci  (self as unknown as Worker).postMessage(
120fb726d48Sopenharmony_ci    {
121fb726d48Sopenharmony_ci      transfer: transfer,
122fb726d48Sopenharmony_ci      // @ts-ignore
123fb726d48Sopenharmony_ci      id: data.id,
124fb726d48Sopenharmony_ci      // @ts-ignore
125fb726d48Sopenharmony_ci      action: data.action,
126fb726d48Sopenharmony_ci      results: transfer
127fb726d48Sopenharmony_ci        ? {
128fb726d48Sopenharmony_ci            startNS: perfCpu.startNS.buffer,
129fb726d48Sopenharmony_ci            eventCount: perfCpu.eventCount.buffer,
130fb726d48Sopenharmony_ci            sampleCount: perfCpu.sampleCount.buffer,
131fb726d48Sopenharmony_ci            eventTypeId: perfCpu.eventTypeId.buffer,
132fb726d48Sopenharmony_ci            callChainId: perfCpu.callChainId.buffer,
133fb726d48Sopenharmony_ci            height: perfCpu.height.buffer,
134fb726d48Sopenharmony_ci          }
135fb726d48Sopenharmony_ci        : {},
136fb726d48Sopenharmony_ci      len: len,
137fb726d48Sopenharmony_ci    },
138fb726d48Sopenharmony_ci    transfer
139fb726d48Sopenharmony_ci      ? [
140fb726d48Sopenharmony_ci          perfCpu.startNS.buffer,
141fb726d48Sopenharmony_ci          perfCpu.eventCount.buffer,
142fb726d48Sopenharmony_ci          perfCpu.sampleCount.buffer,
143fb726d48Sopenharmony_ci          perfCpu.eventTypeId.buffer,
144fb726d48Sopenharmony_ci          perfCpu.callChainId.buffer,
145fb726d48Sopenharmony_ci          perfCpu.height.buffer,
146fb726d48Sopenharmony_ci        ]
147fb726d48Sopenharmony_ci      : []
148fb726d48Sopenharmony_ci  );
149fb726d48Sopenharmony_ci}
150fb726d48Sopenharmony_ciclass PerfCpu {
151fb726d48Sopenharmony_ci  startNS: Float64Array;
152fb726d48Sopenharmony_ci  eventCount: Int32Array;
153fb726d48Sopenharmony_ci  sampleCount: Int32Array;
154fb726d48Sopenharmony_ci  eventTypeId: Int32Array;
155fb726d48Sopenharmony_ci  callChainId: Int32Array;
156fb726d48Sopenharmony_ci  height: Int32Array;
157fb726d48Sopenharmony_ci  constructor(data: unknown, transfer: boolean, len: number) {
158fb726d48Sopenharmony_ci    // @ts-ignore
159fb726d48Sopenharmony_ci    this.startNS = new Float64Array(transfer ? len : data.params.sharedArrayBuffers.startNS);
160fb726d48Sopenharmony_ci    // @ts-ignore
161fb726d48Sopenharmony_ci    this.eventCount = new Int32Array(transfer ? len : data.params.sharedArrayBuffers.eventCount);
162fb726d48Sopenharmony_ci    // @ts-ignore
163fb726d48Sopenharmony_ci    this.sampleCount = new Int32Array(transfer ? len : data.params.sharedArrayBuffers.sampleCount);
164fb726d48Sopenharmony_ci    // @ts-ignore
165fb726d48Sopenharmony_ci    this.eventTypeId = new Int32Array(transfer ? len : data.params.sharedArrayBuffers.eventTypeId);
166fb726d48Sopenharmony_ci    // @ts-ignore
167fb726d48Sopenharmony_ci    this.callChainId = new Int32Array(transfer ? len : data.params.sharedArrayBuffers.callChainId);
168fb726d48Sopenharmony_ci    // @ts-ignore
169fb726d48Sopenharmony_ci    this.height = new Int32Array(transfer ? len : data.params.sharedArrayBuffers.height);
170fb726d48Sopenharmony_ci  }
171fb726d48Sopenharmony_ci}
172