1/* 2 * Copyright (C) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16import { TraficEnum } from '../utils/QueryEnum'; 17import { filterDataByGroup } from '../utils/DataFilter'; 18import { Args } from '../CommonArgs'; 19 20export const chartXpowerThreadCountDataSql = (args: Args): string => { 21 return ` 22 select 23 start_time - ${args.recordStartNS} as startNs, 24 0 as dur, 25 COUNT(start_time) as value 26 from 27 xpower_app_detail_cpu 28 left join 29 data_dict 30 on data_dict.id = xpower_app_detail_cpu.thread_name_id 31 left join 32 trace_range r 33 group by 34 startNs 35 order by 36 startNs 37 `; 38}; 39export const chartXpowerThreadInfoDataSql = (args: Args): string => { 40 return ` 41 select 42 start_time - ${args.recordStartNS} as startNs, 43 thread_time as threadTime, 44 0 as dur, 45 ${args.valueType} as value, 46 thread_name_id as threadNameId 47 from 48 xpower_app_detail_cpu 49 `; 50}; 51 52export function xpowerDataThreadCountReceiver(data: unknown, proc: Function): void { 53 // @ts-ignore 54 if (data.params.trafic === TraficEnum.Memory) { 55 let res: unknown[]; 56 let list: unknown[]; 57 // @ts-ignore 58 list = proc(chartXpowerThreadCountDataSql(data.params)); 59 for (let j = 0; j < list.length; j++) { 60 if (j === list.length - 1) { 61 // @ts-ignore 62 list[j].dur = (data.params.totalNS || 0) - (list[j].startNs || 0); 63 } else { 64 // @ts-ignore 65 list[j].dur = (list[j + 1].startNs || 0) - (list[j].startNs || 0); 66 } 67 } 68 // @ts-ignore 69 if (data.params.queryAll) { 70 //框选时候取数据,只需要根据时间过滤数据 71 res = (list || []).filter( 72 // @ts-ignore 73 (it) => it.startNs + it.dur >= data.params.selectStartNS && it.startNs <= data.params.selectEndNS 74 ); 75 } else { 76 res = filterDataByGroup( 77 list || [], 78 'startNs', 79 'dur', 80 // @ts-ignore 81 data.params.startNS, 82 // @ts-ignore 83 data.params.endNS, 84 // @ts-ignore 85 data.params.width, 86 'value' 87 ); 88 } 89 threadCountArrayBufferHandler(data, res, true); 90 } else { 91 // @ts-ignore 92 let sql = chartXpowerThreadCountDataSql(data.params); 93 let res = proc(sql); 94 // @ts-ignore 95 threadCountArrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer); 96 } 97} 98 99function threadCountArrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): void { 100 // @ts-ignore 101 let startNS = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.startNS); 102 // @ts-ignore 103 let dur = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.dur); 104 // @ts-ignore 105 let value = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.value); 106 res.forEach((it, i) => { 107 // @ts-ignore 108 data.params.trafic === TraficEnum.ProtoBuffer && (it = it.xpowerThreadCountData); 109 // @ts-ignore 110 dur[i] = it.dur; 111 // @ts-ignore 112 startNS[i] = it.startNs; 113 // @ts-ignore 114 value[i] = it.value; 115 }); 116 (self as unknown as Worker).postMessage( 117 { 118 // @ts-ignore 119 id: data.id, 120 // @ts-ignore 121 action: data.action, 122 results: transfer 123 ? { 124 startNS: startNS.buffer, 125 dur: dur.buffer, 126 value: value.buffer, 127 } 128 : {}, 129 len: res.length, 130 transfer: transfer, 131 }, 132 transfer ? [dur.buffer, startNS.buffer, value.buffer] : [] 133 ); 134} 135 136export function xpowerDataThreadInfoReceiver(data: unknown, proc: Function): void { 137 // @ts-ignore 138 if (data.params.trafic === TraficEnum.Memory) { 139 let res: unknown[]; 140 let list: unknown[]; 141 // @ts-ignore 142 list = proc(chartXpowerThreadInfoDataSql(data.params)); 143 for (let j = 0; j < list.length; j++) { 144 // @ts-ignore 145 list[j].dur = 3000000000; 146 } 147 // @ts-ignore 148 if (data.params.queryAll) { 149 //框选时候取数据,只需要根据时间过滤数据 150 res = (list || []).filter( 151 // @ts-ignore 152 (it) => it.startNs + it.dur >= data.params.selectStartNS && it.startNs <= data.params.selectEndNS 153 ); 154 } else { 155 res = list; 156 } 157 threadInfoArrayBufferHandler(data, res, true); 158 } else { 159 // @ts-ignore 160 let sql = chartXpowerThreadInfoDataSql(data.params); 161 let res = proc(sql); 162 // @ts-ignore 163 threadInfoArrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer); 164 } 165} 166 167function threadInfoArrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): void { 168 // @ts-ignore 169 let startNS = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.startNS); 170 // @ts-ignore 171 let dur = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.dur); 172 // @ts-ignore 173 let value = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.value); 174 // @ts-ignore 175 let threadTime = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.threadTime); 176 // @ts-ignore 177 let threadNameId = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.threadNameId); 178 res.forEach((it, i) => { 179 // @ts-ignore 180 data.params.trafic === TraficEnum.ProtoBuffer && (it = it.xpowerThreadInfoData); 181 // @ts-ignore 182 dur[i] = it.dur; 183 // @ts-ignore 184 startNS[i] = it.startNs; 185 // @ts-ignore 186 value[i] = it.value; 187 // @ts-ignore 188 threadTime[i] = it.threadTime; 189 // @ts-ignore 190 threadNameId[i] = it.threadNameId; 191 }); 192 (self as unknown as Worker).postMessage( 193 { 194 // @ts-ignore 195 id: data.id, 196 // @ts-ignore 197 action: data.action, 198 results: transfer 199 ? { 200 startNS: startNS.buffer, 201 dur: dur.buffer, 202 value: value.buffer, 203 threadTime: threadTime.buffer, 204 threadNameId: threadNameId.buffer, 205 } 206 : {}, 207 len: res.length, 208 transfer: transfer, 209 }, 210 transfer ? [dur.buffer, startNS.buffer, value.buffer, threadTime.buffer, threadNameId.buffer] : [] 211 ); 212} 213