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 chartVirtualMemoryDataSql = (args: Args): string => {
18fb726d48Sopenharmony_ci  return `
19fb726d48Sopenharmony_ci    select ts - ${args.recordStartNS} as startTime,
20fb726d48Sopenharmony_ci           filter_id as filterId,
21fb726d48Sopenharmony_ci           value
22fb726d48Sopenharmony_ci    from sys_mem_measure
23fb726d48Sopenharmony_ci    where filter_id = ${args.filterId}`;
24fb726d48Sopenharmony_ci};
25fb726d48Sopenharmony_ci
26fb726d48Sopenharmony_ciexport const chartVirtualMemoryDataProtoSql = (args: Args): string => {
27fb726d48Sopenharmony_ci  return `
28fb726d48Sopenharmony_ci    select ts - ${args.recordStartNS} as startTime,
29fb726d48Sopenharmony_ci           filter_id as filterId,
30fb726d48Sopenharmony_ci           value,
31fb726d48Sopenharmony_ci           ((ts - ${args.recordStartNS}) / (${Math.floor((args.endNS - args.startNS) / args.width)})) AS px
32fb726d48Sopenharmony_ci    from sys_mem_measure
33fb726d48Sopenharmony_ci    where filter_id = ${args.filterId}
34fb726d48Sopenharmony_ci      and startTime + (ifnull(dur,0)) >= ${Math.floor(args.startNS)}
35fb726d48Sopenharmony_ci      and startTime <= ${Math.floor(args.endNS)}
36fb726d48Sopenharmony_ci    group by px;`;
37fb726d48Sopenharmony_ci};
38fb726d48Sopenharmony_ci
39fb726d48Sopenharmony_cilet vmList: Array<unknown> = []; // @ts-ignore
40fb726d48Sopenharmony_cilet vmListMap = new Map<string, Array<unknown>>();
41fb726d48Sopenharmony_ci
42fb726d48Sopenharmony_ciexport function resetVM(): void {
43fb726d48Sopenharmony_ci  vmList = [];
44fb726d48Sopenharmony_ci  vmListMap.clear();
45fb726d48Sopenharmony_ci}
46fb726d48Sopenharmony_ci
47fb726d48Sopenharmony_ciexport function virtualMemoryDataReceiver(data: unknown, proc: Function): void {
48fb726d48Sopenharmony_ci  // @ts-ignore
49fb726d48Sopenharmony_ci  if (data.params.trafic === TraficEnum.Memory) {
50fb726d48Sopenharmony_ci    // @ts-ignore
51fb726d48Sopenharmony_ci    if (!vmListMap.has(data.params.filterId)) {
52fb726d48Sopenharmony_ci      // @ts-ignore
53fb726d48Sopenharmony_ci      vmList = proc(chartVirtualMemoryDataSql(data.params)); // @ts-ignore
54fb726d48Sopenharmony_ci      vmListMap.set(data.params.filterId, vmList);
55fb726d48Sopenharmony_ci    } // @ts-ignore
56fb726d48Sopenharmony_ci    let list = vmListMap.get(data.params.filterId) || []; // @ts-ignore
57fb726d48Sopenharmony_ci    arrayBufferHandler(data, list, data.params.trafic !== TraficEnum.SharedArrayBuffer);
58fb726d48Sopenharmony_ci  } else {
59fb726d48Sopenharmony_ci    // @ts-ignore
60fb726d48Sopenharmony_ci    let sql = chartVirtualMemoryDataProtoSql(data.params);
61fb726d48Sopenharmony_ci    let res = proc(sql); // @ts-ignore
62fb726d48Sopenharmony_ci    arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer);
63fb726d48Sopenharmony_ci  }
64fb726d48Sopenharmony_ci}
65fb726d48Sopenharmony_ci
66fb726d48Sopenharmony_cifunction arrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): void {
67fb726d48Sopenharmony_ci  // @ts-ignore
68fb726d48Sopenharmony_ci  let startTime = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.startTime); // @ts-ignore
69fb726d48Sopenharmony_ci  let value = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.value); // @ts-ignore
70fb726d48Sopenharmony_ci  let filterID = new Uint8Array(transfer ? res.length : data.params.sharedArrayBuffers.filterID);
71fb726d48Sopenharmony_ci  res.forEach((it, i) => {
72fb726d48Sopenharmony_ci    // @ts-ignore
73fb726d48Sopenharmony_ci    data.params.trafic === TraficEnum.ProtoBuffer && (it = it.virtualMemData); // @ts-ignore
74fb726d48Sopenharmony_ci    startTime[i] = it.startTime; // @ts-ignore
75fb726d48Sopenharmony_ci    filterID[i] = it.filterId; // @ts-ignore
76fb726d48Sopenharmony_ci    value[i] = it.value;
77fb726d48Sopenharmony_ci  });
78fb726d48Sopenharmony_ci  (self as unknown as Worker).postMessage(
79fb726d48Sopenharmony_ci    {
80fb726d48Sopenharmony_ci      // @ts-ignore
81fb726d48Sopenharmony_ci      id: data.id, // @ts-ignore
82fb726d48Sopenharmony_ci      action: data.action,
83fb726d48Sopenharmony_ci      results: transfer
84fb726d48Sopenharmony_ci        ? {
85fb726d48Sopenharmony_ci            startTime: startTime.buffer,
86fb726d48Sopenharmony_ci            value: value.buffer,
87fb726d48Sopenharmony_ci            filterID: filterID.buffer,
88fb726d48Sopenharmony_ci          }
89fb726d48Sopenharmony_ci        : {},
90fb726d48Sopenharmony_ci      len: res.length,
91fb726d48Sopenharmony_ci      transfer: transfer,
92fb726d48Sopenharmony_ci    },
93fb726d48Sopenharmony_ci    transfer ? [startTime.buffer, value.buffer, filterID.buffer] : []
94fb726d48Sopenharmony_ci  );
95fb726d48Sopenharmony_ci}
96