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