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