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'; 15import { xpowerStasticList } from '../utils/AllMemoryCache'; 16import { Args } from '../CommonArgs'; 17 18export const chartXpowerStatisticMemoryDataSql = (args: Args): string => { 19 return ` 20 SELECT a.component_type_id AS type, 21 a.start_time - b.start_ts AS startTime, 22 a.duration AS dur, 23 a.energy 24 FROM xpower_app_statistic a, trace_range b`; 25}; 26 27export const chartXpowerStatisticDataSql = (args: Args): string => { 28 return ` 29 SELECT a.component_type_id AS type, 30 a.start_time - b.start_ts AS startTime, 31 a.duration AS dur, 32 a.energy 33 FROM xpower_app_statistic a, trace_range b`; 34}; 35 36export function xpowerStatisticDataReceiver(data: unknown, proc: Function): void { 37 // @ts-ignore 38 if (data.params.trafic === TraficEnum.Memory) { 39 let list: unknown[]; 40 // @ts-ignore 41 if (!xpowerStasticList.has(data.params.xpowerName)) { 42 // @ts-ignore 43 list = proc(chartXpowerStatisticMemoryDataSql(data.params)); 44 // @ts-ignore 45 xpowerStasticList.set(data.params.xpowerName, list); 46 } else { 47 // @ts-ignore 48 list = xpowerStasticList.get(data.params.xpowerName) || []; 49 } 50 // @ts-ignore 51 if (data.params.queryAll) { 52 list = (list || []).filter( 53 // @ts-ignore 54 (it) => it.startTime + 3000000000 >= data.params.selectStartNS && it.startTime <= data.params.selectEndNS 55 ); 56 } 57 arrayBufferHandler(data, list, true); 58 } else { 59 // @ts-ignore 60 let sql = chartXpowerStatisticDataSql(data.params); 61 let res = proc(sql); 62 // @ts-ignore 63 arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer); 64 } 65} 66 67function arrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): void { 68 // @ts-ignore 69 let dur = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.dur); 70 // @ts-ignore 71 let startTime = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.startTime); 72 // @ts-ignore 73 let energy = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.energy); 74 // @ts-ignore 75 let type = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.type); 76 res.forEach((it, i) => { 77 // @ts-ignore 78 data.params.trafic === TraficEnum.ProtoBuffer && (it = it.xpowerStatisticData); 79 // @ts-ignore 80 dur[i] = it.dur; 81 // @ts-ignore 82 startTime[i] = it.startTime; 83 // @ts-ignore 84 energy[i] = it.energy; 85 // @ts-ignore 86 type[i] = it.type; 87 }); 88 89 (self as unknown as Worker).postMessage( 90 { 91 // @ts-ignore 92 id: data.id, 93 // @ts-ignore 94 action: data.action, 95 results: transfer 96 ? { 97 dur: dur.buffer, 98 startTime: startTime.buffer, 99 type: type.buffer, 100 energy: energy.buffer, 101 } 102 : {}, 103 len: res.length, 104 transfer: transfer, 105 }, 106 transfer ? [dur.buffer, startTime.buffer, type.buffer, energy.buffer] : [] 107 ); 108} 109