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