• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1// Copyright (c) 2021 Huawei Device Co., Ltd.
2// Licensed under the Apache License, Version 2.0 (the "License");
3// you may not use this file except in compliance with the License.
4// You may obtain a copy of the License at
5//
6//     http://www.apache.org/licenses/LICENSE-2.0
7//
8// Unless required by applicable law or agreed to in writing, software
9// distributed under the License is distributed on an "AS IS" BASIS,
10// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11// See the License for the specific language governing permissions and
12// limitations under the License.
13
14import { Args } from './CommonArgs';
15import { TraficEnum } from './utils/QueryEnum';
16
17export const chartVirtualMemoryDataSql = (args: Args): string => {
18  return `
19    select ts - ${args.recordStartNS} as startTime,
20           filter_id as filterId,
21           value
22    from sys_mem_measure
23    where filter_id = ${args.filterId}`;
24};
25
26export const chartVirtualMemoryDataProtoSql = (args: Args): string => {
27  return `
28    select ts - ${args.recordStartNS} as startTime,
29           filter_id as filterId,
30           value,
31           ((ts - ${args.recordStartNS}) / (${Math.floor((args.endNS - args.startNS) / args.width)})) AS px
32    from sys_mem_measure
33    where filter_id = ${args.filterId}
34      and startTime + (ifnull(dur,0)) >= ${Math.floor(args.startNS)}
35      and startTime <= ${Math.floor(args.endNS)}
36    group by px;`;
37};
38
39let vmList: Array<unknown> = []; // @ts-ignore
40let vmListMap = new Map<string, Array<unknown>>();
41
42export function resetVM(): void {
43  vmList = [];
44  vmListMap.clear();
45}
46
47export function virtualMemoryDataReceiver(data: unknown, proc: Function): void {
48  // @ts-ignore
49  if (data.params.trafic === TraficEnum.Memory) {
50    // @ts-ignore
51    if (!vmListMap.has(data.params.filterId)) {
52      // @ts-ignore
53      vmList = proc(chartVirtualMemoryDataSql(data.params)); // @ts-ignore
54      vmListMap.set(data.params.filterId, vmList);
55    } // @ts-ignore
56    let list = vmListMap.get(data.params.filterId) || []; // @ts-ignore
57    arrayBufferHandler(data, list, data.params.trafic !== TraficEnum.SharedArrayBuffer);
58  } else {
59    // @ts-ignore
60    let sql = chartVirtualMemoryDataProtoSql(data.params);
61    let res = proc(sql); // @ts-ignore
62    arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer);
63  }
64}
65
66function arrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): void {
67  // @ts-ignore
68  let startTime = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.startTime); // @ts-ignore
69  let value = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.value); // @ts-ignore
70  let filterID = new Uint8Array(transfer ? res.length : data.params.sharedArrayBuffers.filterID);
71  res.forEach((it, i) => {
72    // @ts-ignore
73    data.params.trafic === TraficEnum.ProtoBuffer && (it = it.virtualMemData); // @ts-ignore
74    startTime[i] = it.startTime; // @ts-ignore
75    filterID[i] = it.filterId; // @ts-ignore
76    value[i] = it.value;
77  });
78  (self as unknown as Worker).postMessage(
79    {
80      // @ts-ignore
81      id: data.id, // @ts-ignore
82      action: data.action,
83      results: transfer
84        ? {
85            startTime: startTime.buffer,
86            value: value.buffer,
87            filterID: filterID.buffer,
88          }
89        : {},
90      len: res.length,
91      transfer: transfer,
92    },
93    transfer ? [startTime.buffer, value.buffer, filterID.buffer] : []
94  );
95}
96