1fb726d48Sopenharmony_ci// Copyright (c) 2021 Huawei Device Co., Ltd.
2fb726d48Sopenharmony_ci// Licensed under the Apache License, Version 2.0 (the "License");
3fb726d48Sopenharmony_ci// you may not use this file except in compliance with the License.
4fb726d48Sopenharmony_ci// You may obtain a copy of the License at
5fb726d48Sopenharmony_ci//
6fb726d48Sopenharmony_ci//     http://www.apache.org/licenses/LICENSE-2.0
7fb726d48Sopenharmony_ci//
8fb726d48Sopenharmony_ci// Unless required by applicable law or agreed to in writing, software
9fb726d48Sopenharmony_ci// distributed under the License is distributed on an "AS IS" BASIS,
10fb726d48Sopenharmony_ci// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11fb726d48Sopenharmony_ci// See the License for the specific language governing permissions and
12fb726d48Sopenharmony_ci// limitations under the License.
13fb726d48Sopenharmony_ci
14fb726d48Sopenharmony_ciimport { Args } from './CommonArgs';
15fb726d48Sopenharmony_ciimport { cpuList, processList, sliceList, threadStateList } from './utils/AllMemoryCache';
16fb726d48Sopenharmony_ciconst dataCache: {
17fb726d48Sopenharmony_ci  argSetID: number | null | undefined;
18fb726d48Sopenharmony_ci  cpu: number | null | undefined;
19fb726d48Sopenharmony_ci  dur: number | null | undefined;
20fb726d48Sopenharmony_ci  itid: number | null | undefined;
21fb726d48Sopenharmony_ci  pid: number | null | undefined;
22fb726d48Sopenharmony_ci  state: string | null | undefined;
23fb726d48Sopenharmony_ci  tid: number | null | undefined;
24fb726d48Sopenharmony_ci  startTime: number | null | undefined;
25fb726d48Sopenharmony_ci} = {
26fb726d48Sopenharmony_ci  argSetID: null,
27fb726d48Sopenharmony_ci  cpu: null,
28fb726d48Sopenharmony_ci  dur: null,
29fb726d48Sopenharmony_ci  itid: null,
30fb726d48Sopenharmony_ci  pid: null,
31fb726d48Sopenharmony_ci  state: null,
32fb726d48Sopenharmony_ci  tid: null,
33fb726d48Sopenharmony_ci  startTime: null
34fb726d48Sopenharmony_ci};
35fb726d48Sopenharmony_ciexport const sliceSqlMem = (args: Args): string => {
36fb726d48Sopenharmony_ci  return `
37fb726d48Sopenharmony_ci      SELECT B.pid,                        
38fb726d48Sopenharmony_ci             B.cpu,
39fb726d48Sopenharmony_ci             B.tid,
40fb726d48Sopenharmony_ci             B.itid                       as id,
41fb726d48Sopenharmony_ci             B.dur                        AS dur,
42fb726d48Sopenharmony_ci             B.state,
43fb726d48Sopenharmony_ci             B.ts - ${args.recordStartNS} AS startTime,
44fb726d48Sopenharmony_ci             ifnull(B.arg_setid, -1)      as argSetId
45fb726d48Sopenharmony_ci      from thread_state AS B
46fb726d48Sopenharmony_ci      where B.itid is not null and B.ts + ifnull(B.dur, 0) < ${args.recordEndNS}`;
47fb726d48Sopenharmony_ci};
48fb726d48Sopenharmony_ci
49fb726d48Sopenharmony_ciexport function sliceReceiver(data: unknown, proc: Function): void {
50fb726d48Sopenharmony_ci  let count = {
51fb726d48Sopenharmony_ci    cpu: new Map<number, number>(),
52fb726d48Sopenharmony_ci  };
53fb726d48Sopenharmony_ci  // 存储线程及其状态耗时总和;用以线程泳道排序
54fb726d48Sopenharmony_ci  let threadMap = new Map<string, number>();
55fb726d48Sopenharmony_ci  let processRowSortMap = new Map<string, number>();
56fb726d48Sopenharmony_ci  sliceList.clear();
57fb726d48Sopenharmony_ci  cpuList.clear();
58fb726d48Sopenharmony_ci  processList.clear();
59fb726d48Sopenharmony_ci  threadStateList.clear(); //@ts-ignore
60fb726d48Sopenharmony_ci  let list: unknown[] = proc(sliceSqlMem(data.params));
61fb726d48Sopenharmony_ci  sliceList.set(0, list);
62fb726d48Sopenharmony_ci  for (let i = 0; i < list.length; i++) {
63fb726d48Sopenharmony_ci    let slice = list[i]; //@ts-ignore
64fb726d48Sopenharmony_ci    // @ts-ignore
65fb726d48Sopenharmony_ci    if (slice.pid > 0 && typeof slice.pid === 'number' && slice.state === 'Running') {
66fb726d48Sopenharmony_ci      // @ts-ignore
67fb726d48Sopenharmony_ci      if (!processRowSortMap.has(slice.pid)) {
68fb726d48Sopenharmony_ci        // @ts-ignore
69fb726d48Sopenharmony_ci        processRowSortMap.set(slice.pid, slice.dur);
70fb726d48Sopenharmony_ci      } else {
71fb726d48Sopenharmony_ci        // @ts-ignore
72fb726d48Sopenharmony_ci        let val = processRowSortMap.get(slice.pid);
73fb726d48Sopenharmony_ci        // @ts-ignore
74fb726d48Sopenharmony_ci        processRowSortMap.set(slice.pid, val + slice.dur);
75fb726d48Sopenharmony_ci      }
76fb726d48Sopenharmony_ci    }// @ts-ignore
77fb726d48Sopenharmony_ci    if (slice.cpu !== null && slice.cpu !== undefined) {
78fb726d48Sopenharmony_ci      //@ts-ignore
79fb726d48Sopenharmony_ci      if (cpuList.has(slice.cpu)) {
80fb726d48Sopenharmony_ci        //@ts-ignore
81fb726d48Sopenharmony_ci        let arr = cpuList.get(slice.cpu) || [];
82fb726d48Sopenharmony_ci        let last = arr[arr.length - 1];
83fb726d48Sopenharmony_ci        //@ts-ignore
84fb726d48Sopenharmony_ci        if (last && (last.dur === -1 || last.dur === null || last.dur === undefined)) {
85fb726d48Sopenharmony_ci          //@ts-ignore
86fb726d48Sopenharmony_ci          last.dur = slice.startTime - last.startTime;
87fb726d48Sopenharmony_ci        } //@ts-ignore
88fb726d48Sopenharmony_ci        cpuList.get(slice.cpu)!.push(slice);
89fb726d48Sopenharmony_ci      } else {
90fb726d48Sopenharmony_ci        //@ts-ignore
91fb726d48Sopenharmony_ci        cpuList.set(slice.cpu, [slice]);
92fb726d48Sopenharmony_ci      }
93fb726d48Sopenharmony_ci    } //@ts-ignore
94fb726d48Sopenharmony_ci    if (slice.pid >= 0 && slice.cpu !== null && slice.cpu !== undefined) {
95fb726d48Sopenharmony_ci      //@ts-ignore
96fb726d48Sopenharmony_ci      if (processList.has(slice.pid)) {
97fb726d48Sopenharmony_ci        //@ts-ignore
98fb726d48Sopenharmony_ci        processList.get(slice.pid)!.push(slice);
99fb726d48Sopenharmony_ci      } else {
100fb726d48Sopenharmony_ci        //@ts-ignore
101fb726d48Sopenharmony_ci        processList.set(slice.pid, [slice]);
102fb726d48Sopenharmony_ci      }
103fb726d48Sopenharmony_ci    } //@ts-ignore
104fb726d48Sopenharmony_ci    if (slice.pid >= 0 && slice.tid >= 0) {
105fb726d48Sopenharmony_ci      //@ts-ignore
106fb726d48Sopenharmony_ci      let key = `${slice.pid}-${slice.tid}`;
107fb726d48Sopenharmony_ci      if (threadStateList.has(key)) {
108fb726d48Sopenharmony_ci        threadStateList.get(key)!.push(slice);
109fb726d48Sopenharmony_ci      } else {
110fb726d48Sopenharmony_ci        threadStateList.set(key, [slice]);
111fb726d48Sopenharmony_ci      }
112fb726d48Sopenharmony_ci      // @ts-ignore
113fb726d48Sopenharmony_ci      if (slice.state === 'S' || typeof slice.dur !== 'number' || slice.tid === 0) {
114fb726d48Sopenharmony_ci        continue;
115fb726d48Sopenharmony_ci      } else {
116fb726d48Sopenharmony_ci        // @ts-ignore
117fb726d48Sopenharmony_ci        if (!threadMap.has(key)) {
118fb726d48Sopenharmony_ci          // @ts-ignore
119fb726d48Sopenharmony_ci          threadMap.set(key, slice.dur);
120fb726d48Sopenharmony_ci        } else {
121fb726d48Sopenharmony_ci          // @ts-ignore
122fb726d48Sopenharmony_ci          let val = threadMap.get(key);
123fb726d48Sopenharmony_ci          // @ts-ignore
124fb726d48Sopenharmony_ci          threadMap.set(key, val + slice.dur);
125fb726d48Sopenharmony_ci        }
126fb726d48Sopenharmony_ci      }
127fb726d48Sopenharmony_ci    }
128fb726d48Sopenharmony_ci  }
129fb726d48Sopenharmony_ci  for (let key of cpuList.keys()) {
130fb726d48Sopenharmony_ci    let arr = cpuList.get(key) || [];
131fb726d48Sopenharmony_ci    count.cpu.set(key, arr.length);
132fb726d48Sopenharmony_ci  }
133fb726d48Sopenharmony_ci  //处理threadList最后一个符合条件的dur
134fb726d48Sopenharmony_ci  for (let key of threadStateList.keys()) {
135fb726d48Sopenharmony_ci    let arr = threadStateList.get(key) || [];
136fb726d48Sopenharmony_ci    let last = arr[arr.length - 1];
137fb726d48Sopenharmony_ci    if (!last) {
138fb726d48Sopenharmony_ci      continue;
139fb726d48Sopenharmony_ci    }
140fb726d48Sopenharmony_ci    //@ts-ignore
141fb726d48Sopenharmony_ci    switch (last.state) {
142fb726d48Sopenharmony_ci      case 'S':
143fb726d48Sopenharmony_ci      case 'I':
144fb726d48Sopenharmony_ci      case 'T':
145fb726d48Sopenharmony_ci      case 'X':
146fb726d48Sopenharmony_ci        break;
147fb726d48Sopenharmony_ci      default:
148fb726d48Sopenharmony_ci        //@ts-ignore
149fb726d48Sopenharmony_ci        if (last.dur === -1 || last.dur === null || last.dur === undefined) {
150fb726d48Sopenharmony_ci          //@ts-ignore
151fb726d48Sopenharmony_ci          let totalNs = data.params.recordEndNS - data.params.recordStartNS; //@ts-ignore
152fb726d48Sopenharmony_ci          last.dur = totalNs - last.startTime;
153fb726d48Sopenharmony_ci        }
154fb726d48Sopenharmony_ci        break;
155fb726d48Sopenharmony_ci    }
156fb726d48Sopenharmony_ci  }
157fb726d48Sopenharmony_ci  //处理热点数据
158fb726d48Sopenharmony_ci  //@ts-ignore
159fb726d48Sopenharmony_ci  let cpuUtiliRateArray = getCpuUtiliRate(cpuList, data.params);
160fb726d48Sopenharmony_ci  postMsg(data, { count, threadMap, processRowSortMap, cpuUtiliRateArray });
161fb726d48Sopenharmony_ci}
162fb726d48Sopenharmony_ci
163fb726d48Sopenharmony_cifunction getCpuUtiliRate(cpulist: Map<number, Array<unknown>>, args: Args): Array<unknown> {
164fb726d48Sopenharmony_ci  // cpu进行排序  
165fb726d48Sopenharmony_ci  let cpuListArray = Array.from(cpulist.entries());
166fb726d48Sopenharmony_ci  //@ts-ignore
167fb726d48Sopenharmony_ci  cpuListArray.sort((a: unknown, b: unknown) => parseInt(a[0]) - parseInt(b[0]));
168fb726d48Sopenharmony_ci  let cpuListMap = new Map(cpuListArray);
169fb726d48Sopenharmony_ci  let cpuUtiliRateArray = new Array();
170fb726d48Sopenharmony_ci  let cell = Math.floor((args.recordEndNS - args.recordStartNS) / 100);//分成100个格子,cell每个格子的持续时间
171fb726d48Sopenharmony_ci  for (const [cpu, list] of cpuListMap.entries()) {
172fb726d48Sopenharmony_ci    let ro = 0;
173fb726d48Sopenharmony_ci    let index = 0;
174fb726d48Sopenharmony_ci    let sumTime = 0;
175fb726d48Sopenharmony_ci    //@ts-ignore
176fb726d48Sopenharmony_ci    let sliceSt = list[0].startTime;//起始时间
177fb726d48Sopenharmony_ci    let cellSt = ro * cell;//每个格子起始时间
178fb726d48Sopenharmony_ci    let cellEt = (ro + 1) * cell;//每个格子的结束时间
179fb726d48Sopenharmony_ci    //@ts-ignore
180fb726d48Sopenharmony_ci    while (index < list.length && ro <= 99) {
181fb726d48Sopenharmony_ci      let isGoNextRo = false;//标志位,当下格子区间内的cpu切片持续时间是否统计结束,如统计结束true可跳转至下一个格子区间,反之false
182fb726d48Sopenharmony_ci      //@ts-ignore
183fb726d48Sopenharmony_ci      let sliceEt = list[index].startTime + list[index].dur;//cpu结束时间
184fb726d48Sopenharmony_ci      if (sliceSt >= cellSt && sliceEt <= cellEt) {//包含在ro内
185fb726d48Sopenharmony_ci        //@ts-ignore
186fb726d48Sopenharmony_ci        sumTime += (sliceEt - sliceSt);//cpu dur累加
187fb726d48Sopenharmony_ci        //@ts-ignore
188fb726d48Sopenharmony_ci        sliceSt = index + 1 >= list.length ? sliceSt : list[index + 1].startTime;//处理最后一条cpu数据
189fb726d48Sopenharmony_ci        index++;
190fb726d48Sopenharmony_ci      } else if (sliceSt >= cellSt && sliceSt < cellEt && sliceEt > cellEt) {//部分包含在ro内
191fb726d48Sopenharmony_ci        sumTime = sumTime + (cellEt - sliceSt);
192fb726d48Sopenharmony_ci        sliceSt = cellEt;
193fb726d48Sopenharmony_ci        isGoNextRo = true;
194fb726d48Sopenharmony_ci      } else if (sliceSt >= cellEt) {//不包含在ro内
195fb726d48Sopenharmony_ci        isGoNextRo = true;
196fb726d48Sopenharmony_ci      } else {//保护逻辑
197fb726d48Sopenharmony_ci        //@ts-ignore
198fb726d48Sopenharmony_ci        sliceSt = index + 1 >= list.length ? sliceSt : list[index + 1].startTime;
199fb726d48Sopenharmony_ci        index++;
200fb726d48Sopenharmony_ci      }
201fb726d48Sopenharmony_ci      if (isGoNextRo) {//格子内cpu dur累加结束 跳转至下一个Ro 处理比率 储存处理后的数据
202fb726d48Sopenharmony_ci        ro++;
203fb726d48Sopenharmony_ci        cellSt = ro * cell;//下一个格子的起始时间
204fb726d48Sopenharmony_ci        //第99个格子结束时间为recordEndNS,确保覆盖整个时间范围
205fb726d48Sopenharmony_ci        if (ro < 99) {
206fb726d48Sopenharmony_ci          cellEt = (ro + 1) * cell;//下一个格子结束时间
207fb726d48Sopenharmony_ci        } else {
208fb726d48Sopenharmony_ci          cellEt = args.recordEndNS - args.recordStartNS;
209fb726d48Sopenharmony_ci        }
210fb726d48Sopenharmony_ci        //处理比率 储存处理后的数据
211fb726d48Sopenharmony_ci        if (sumTime !== 0) {
212fb726d48Sopenharmony_ci          let rate = sumTime / cell;
213fb726d48Sopenharmony_ci          cpuUtiliRateArray.push({ ro: ro - 1, cpu, rate });
214fb726d48Sopenharmony_ci          sumTime = 0;
215fb726d48Sopenharmony_ci        }
216fb726d48Sopenharmony_ci      }
217fb726d48Sopenharmony_ci    }
218fb726d48Sopenharmony_ci    //处理最后一个sumTime不为0区间的数据
219fb726d48Sopenharmony_ci    if (sumTime !== 0) {
220fb726d48Sopenharmony_ci      let rate = sumTime / cell;
221fb726d48Sopenharmony_ci      cpuUtiliRateArray.push({ ro, cpu, rate });
222fb726d48Sopenharmony_ci    }
223fb726d48Sopenharmony_ci  }
224fb726d48Sopenharmony_ci  return cpuUtiliRateArray;
225fb726d48Sopenharmony_ci}
226fb726d48Sopenharmony_ci
227fb726d48Sopenharmony_ciexport function sliceSPTReceiver(data: unknown): void {
228fb726d48Sopenharmony_ci  //@ts-ignore
229fb726d48Sopenharmony_ci  if (data && data.params.func) {
230fb726d48Sopenharmony_ci    //@ts-ignore
231fb726d48Sopenharmony_ci    switch (data.params.func) {
232fb726d48Sopenharmony_ci      case 'spt-getPTS':
233fb726d48Sopenharmony_ci        getPTS(data);
234fb726d48Sopenharmony_ci        break;
235fb726d48Sopenharmony_ci      case 'spt-getSPT':
236fb726d48Sopenharmony_ci        getSPT(data);
237fb726d48Sopenharmony_ci        break;
238fb726d48Sopenharmony_ci      case 'spt-getCpuPriorityByTime':
239fb726d48Sopenharmony_ci        sptGetCpuPriorityByTime(data);
240fb726d48Sopenharmony_ci        break;
241fb726d48Sopenharmony_ci      case 'state-box':
242fb726d48Sopenharmony_ci        getChildBoxDb(data);
243fb726d48Sopenharmony_ci        break;
244fb726d48Sopenharmony_ci      case 'near-data':
245fb726d48Sopenharmony_ci        seacrhThreadNearData(data);
246fb726d48Sopenharmony_ci        break;
247fb726d48Sopenharmony_ci    }
248fb726d48Sopenharmony_ci  }
249fb726d48Sopenharmony_ci}
250fb726d48Sopenharmony_ci
251fb726d48Sopenharmony_cifunction postMsg(data: unknown, res: unknown): void {
252fb726d48Sopenharmony_ci  (self as unknown as Worker).postMessage(
253fb726d48Sopenharmony_ci    {
254fb726d48Sopenharmony_ci      //@ts-ignore
255fb726d48Sopenharmony_ci      id: data.id, //@ts-ignore
256fb726d48Sopenharmony_ci      action: data.action,
257fb726d48Sopenharmony_ci      results: res, //@ts-ignore
258fb726d48Sopenharmony_ci      len: res.length,
259fb726d48Sopenharmony_ci      transfer: false,
260fb726d48Sopenharmony_ci    },
261fb726d48Sopenharmony_ci    []
262fb726d48Sopenharmony_ci  );
263fb726d48Sopenharmony_ci}
264fb726d48Sopenharmony_ci
265fb726d48Sopenharmony_cifunction getSPT(data: unknown): void {
266fb726d48Sopenharmony_ci  let threadSlice = sliceList.get(0) || [];
267fb726d48Sopenharmony_ci  let sptFilter = threadSlice.filter(
268fb726d48Sopenharmony_ci    (it) =>
269fb726d48Sopenharmony_ci      //@ts-ignore
270fb726d48Sopenharmony_ci      Math.max(data.params.leftNs, it.startTime!) < Math.min(data.params.rightNs, it.startTime! + it.dur!) &&
271fb726d48Sopenharmony_ci      //@ts-ignore
272fb726d48Sopenharmony_ci      (it.cpu === null || it.cpu === undefined || data.params.cpus.includes(it.cpu))
273fb726d48Sopenharmony_ci  );
274fb726d48Sopenharmony_ci  let group: unknown = {};
275fb726d48Sopenharmony_ci  sptFilter.forEach((slice) => {
276fb726d48Sopenharmony_ci    let item = {
277fb726d48Sopenharmony_ci      //@ts-ignore
278fb726d48Sopenharmony_ci      title: `T-${slice.tid}`,
279fb726d48Sopenharmony_ci      count: 1, //@ts-ignore
280fb726d48Sopenharmony_ci      state: slice.state, //@ts-ignore
281fb726d48Sopenharmony_ci      pid: slice.pid, //@ts-ignore
282fb726d48Sopenharmony_ci      tid: slice.tid, //@ts-ignore
283fb726d48Sopenharmony_ci      minDuration: slice.dur || 0, //@ts-ignore
284fb726d48Sopenharmony_ci      maxDuration: slice.dur || 0, //@ts-ignore
285fb726d48Sopenharmony_ci      wallDuration: slice.dur || 0, //@ts-ignore
286fb726d48Sopenharmony_ci      avgDuration: `${slice.dur}`,
287fb726d48Sopenharmony_ci    }; //@ts-ignore
288fb726d48Sopenharmony_ci    if (group[`${slice.state}`]) {
289fb726d48Sopenharmony_ci      setSPTData(group, slice, item);
290fb726d48Sopenharmony_ci    } else {
291fb726d48Sopenharmony_ci      //@ts-ignore
292fb726d48Sopenharmony_ci      group[`${slice.state}`] = {
293fb726d48Sopenharmony_ci        //@ts-ignore
294fb726d48Sopenharmony_ci        title: `S-${slice.state}`,
295fb726d48Sopenharmony_ci        count: 1, //@ts-ignore
296fb726d48Sopenharmony_ci        state: slice.state, //@ts-ignore
297fb726d48Sopenharmony_ci        minDuration: slice.dur || 0, //@ts-ignore
298fb726d48Sopenharmony_ci        maxDuration: slice.dur || 0, //@ts-ignore
299fb726d48Sopenharmony_ci        wallDuration: slice.dur || 0, //@ts-ignore
300fb726d48Sopenharmony_ci        avgDuration: `${slice.dur}`,
301fb726d48Sopenharmony_ci        children: [
302fb726d48Sopenharmony_ci          {
303fb726d48Sopenharmony_ci            //@ts-ignore
304fb726d48Sopenharmony_ci            title: `P-${slice.pid}`,
305fb726d48Sopenharmony_ci            count: 1, //@ts-ignore
306fb726d48Sopenharmony_ci            state: slice.state, //@ts-ignore
307fb726d48Sopenharmony_ci            pid: slice.pid, //@ts-ignore
308fb726d48Sopenharmony_ci            minDuration: slice.dur || 0, //@ts-ignore
309fb726d48Sopenharmony_ci            maxDuration: slice.dur || 0, //@ts-ignore
310fb726d48Sopenharmony_ci            wallDuration: slice.dur || 0, //@ts-ignore
311fb726d48Sopenharmony_ci            avgDuration: `${slice.dur}`,
312fb726d48Sopenharmony_ci            children: [item],
313fb726d48Sopenharmony_ci          },
314fb726d48Sopenharmony_ci        ],
315fb726d48Sopenharmony_ci      };
316fb726d48Sopenharmony_ci    }
317fb726d48Sopenharmony_ci  }); //@ts-ignore
318fb726d48Sopenharmony_ci  postMsg(data, Object.values(group));
319fb726d48Sopenharmony_ci}
320fb726d48Sopenharmony_ci
321fb726d48Sopenharmony_cifunction getPTS(data: unknown): void {
322fb726d48Sopenharmony_ci  let threadSlice = sliceList.get(0) || [];
323fb726d48Sopenharmony_ci  let ptsFilter = threadSlice.filter(
324fb726d48Sopenharmony_ci    (it) =>
325fb726d48Sopenharmony_ci      //@ts-ignore
326fb726d48Sopenharmony_ci      Math.max(data.params.leftNs, it.startTime!) < Math.min(data.params.rightNs, it.startTime! + it.dur!) && //@ts-ignore
327fb726d48Sopenharmony_ci      (it.cpu === null || it.cpu === undefined || data.params.cpus.includes(it.cpu))
328fb726d48Sopenharmony_ci  );
329fb726d48Sopenharmony_ci  let group: unknown = {};
330fb726d48Sopenharmony_ci  ptsFilter.forEach((slice) => {
331fb726d48Sopenharmony_ci    //@ts-ignore
332fb726d48Sopenharmony_ci    let title = `S-${slice.state}`;
333fb726d48Sopenharmony_ci    let item = setStateData(slice, title); //@ts-ignore
334fb726d48Sopenharmony_ci    if (group[`${slice.pid}`]) {
335fb726d48Sopenharmony_ci      //@ts-ignore
336fb726d48Sopenharmony_ci      let process = group[`${slice.pid}`];
337fb726d48Sopenharmony_ci      process.count += 1; //@ts-ignore
338fb726d48Sopenharmony_ci      process.wallDuration += slice.dur; //@ts-ignore
339fb726d48Sopenharmony_ci      process.minDuration = Math.min(process.minDuration, slice.dur!); //@ts-ignore
340fb726d48Sopenharmony_ci      process.maxDuration = Math.max(process.maxDuration, slice.dur!);
341fb726d48Sopenharmony_ci      process.avgDuration = (process.wallDuration / process.count).toFixed(2); //@ts-ignore
342fb726d48Sopenharmony_ci      let thread = process.children.find((child: unknown) => child.title === `T-${slice.tid}`);
343fb726d48Sopenharmony_ci      if (thread) {
344fb726d48Sopenharmony_ci        thread.count += 1; //@ts-ignore
345fb726d48Sopenharmony_ci        thread.wallDuration += slice.dur; //@ts-ignore
346fb726d48Sopenharmony_ci        thread.minDuration = Math.min(thread.minDuration, slice.dur!); //@ts-ignore
347fb726d48Sopenharmony_ci        thread.maxDuration = Math.max(thread.maxDuration, slice.dur!);
348fb726d48Sopenharmony_ci        thread.avgDuration = (thread.wallDuration / thread.count).toFixed(2); //@ts-ignore
349fb726d48Sopenharmony_ci        let state = thread.children.find((child: unknown) => child.title === `S-${slice.state}`);
350fb726d48Sopenharmony_ci        if (state) {
351fb726d48Sopenharmony_ci          state.count += 1; //@ts-ignore
352fb726d48Sopenharmony_ci          state.wallDuration += slice.dur; //@ts-ignore
353fb726d48Sopenharmony_ci          state.minDuration = Math.min(state.minDuration, slice.dur!); //@ts-ignore
354fb726d48Sopenharmony_ci          state.maxDuration = Math.max(state.maxDuration, slice.dur!);
355fb726d48Sopenharmony_ci          state.avgDuration = (state.wallDuration / state.count).toFixed(2);
356fb726d48Sopenharmony_ci        } else {
357fb726d48Sopenharmony_ci          thread.children.push(item);
358fb726d48Sopenharmony_ci        }
359fb726d48Sopenharmony_ci      } else {
360fb726d48Sopenharmony_ci        let processChild = setThreadData(slice, item);
361fb726d48Sopenharmony_ci        process.children.push(processChild);
362fb726d48Sopenharmony_ci      }
363fb726d48Sopenharmony_ci    } else {
364fb726d48Sopenharmony_ci      //@ts-ignore
365fb726d48Sopenharmony_ci      group[`${slice.pid}`] = setProcessData(slice, item);
366fb726d48Sopenharmony_ci    }
367fb726d48Sopenharmony_ci  }); //@ts-ignore
368fb726d48Sopenharmony_ci  postMsg(data, Object.values(group));
369fb726d48Sopenharmony_ci}
370fb726d48Sopenharmony_ci
371fb726d48Sopenharmony_cifunction sptGetCpuPriorityByTime(data: unknown): void {
372fb726d48Sopenharmony_ci  let threadSlice = sliceList.get(0) || [];
373fb726d48Sopenharmony_ci  const result = threadSlice.filter((item: unknown) => {
374fb726d48Sopenharmony_ci    //@ts-ignore
375fb726d48Sopenharmony_ci    return !(item.startTime + item.dur < data.params.leftNs || item.startTime! > data.params.rightNs);
376fb726d48Sopenharmony_ci  });
377fb726d48Sopenharmony_ci  postMsg(data, result);
378fb726d48Sopenharmony_ci}
379fb726d48Sopenharmony_ci
380fb726d48Sopenharmony_ci//处理跳转子页面的数据
381fb726d48Sopenharmony_cifunction getChildBoxDb(data: unknown): void {
382fb726d48Sopenharmony_ci  let threadSlice = sliceList.get(0) || [];
383fb726d48Sopenharmony_ci  let setProcessId;
384fb726d48Sopenharmony_ci  let setThreadId;
385fb726d48Sopenharmony_ci  let setCpu = new Set();
386fb726d48Sopenharmony_ci  //处理processId数据
387fb726d48Sopenharmony_ci  //@ts-ignore
388fb726d48Sopenharmony_ci  setProcessId = handleIdParams(data.params.processId);
389fb726d48Sopenharmony_ci  //处理threadId数据
390fb726d48Sopenharmony_ci  //@ts-ignore
391fb726d48Sopenharmony_ci  setThreadId = handleIdParams(data.params.threadId);
392fb726d48Sopenharmony_ci  //处理Cpu数据
393fb726d48Sopenharmony_ci  //@ts-ignore
394fb726d48Sopenharmony_ci  if (data.params.cpus) {//@ts-ignore
395fb726d48Sopenharmony_ci    if (data.params.cpus.length > 0) {
396fb726d48Sopenharmony_ci      //@ts-ignore
397fb726d48Sopenharmony_ci      setCpu = new Set(data.params.cpus);
398fb726d48Sopenharmony_ci    }
399fb726d48Sopenharmony_ci  }
400fb726d48Sopenharmony_ci
401fb726d48Sopenharmony_ci  let childBoxDb = threadSlice.filter((it: unknown) => {
402fb726d48Sopenharmony_ci    let condition = true;
403fb726d48Sopenharmony_ci    // 检查进程ID  
404fb726d48Sopenharmony_ci    if (setProcessId.size !== 0) {
405fb726d48Sopenharmony_ci      //@ts-ignore
406fb726d48Sopenharmony_ci      condition = condition && setProcessId.has(it.pid);
407fb726d48Sopenharmony_ci    }
408fb726d48Sopenharmony_ci    // 检查线程ID  
409fb726d48Sopenharmony_ci    if (setThreadId.size !== 0) {
410fb726d48Sopenharmony_ci      //@ts-ignore
411fb726d48Sopenharmony_ci      condition = condition && setThreadId.has(it.tid);
412fb726d48Sopenharmony_ci    }
413fb726d48Sopenharmony_ci    // 检查CPU(如果存在且不是null/undefined,或在setCpu中)  
414fb726d48Sopenharmony_ci    if (setCpu.size !== 0) {
415fb726d48Sopenharmony_ci      //@ts-ignore
416fb726d48Sopenharmony_ci      condition = condition && (it.cpu === null || it.cpu === undefined || setCpu.has(it.cpu));
417fb726d48Sopenharmony_ci    }
418fb726d48Sopenharmony_ci    // 检查状态
419fb726d48Sopenharmony_ci    //@ts-ignore  
420fb726d48Sopenharmony_ci    if (data.params.state) {
421fb726d48Sopenharmony_ci      //@ts-ignore  
422fb726d48Sopenharmony_ci      condition = condition && it.state === data.params.state;
423fb726d48Sopenharmony_ci    }
424fb726d48Sopenharmony_ci    //@ts-ignore
425fb726d48Sopenharmony_ci    return condition && Math.max(data.params.leftNs, it.startTime!) < Math.min(data.params.rightNs, it.startTime! + it.dur!);
426fb726d48Sopenharmony_ci  });
427fb726d48Sopenharmony_ci  postMsg(data, childBoxDb);
428fb726d48Sopenharmony_ci}
429fb726d48Sopenharmony_ci//处理processId和threadId
430fb726d48Sopenharmony_cifunction handleIdParams(id: number | number[] | undefined): Set<unknown> {
431fb726d48Sopenharmony_ci  let setId: Set<unknown>;
432fb726d48Sopenharmony_ci  if (Array.isArray(id) || typeof id === 'number') {
433fb726d48Sopenharmony_ci    setId = new Set(Array.isArray(id) ? id : [id]);
434fb726d48Sopenharmony_ci  } else {
435fb726d48Sopenharmony_ci    setId = new Set();
436fb726d48Sopenharmony_ci  }
437fb726d48Sopenharmony_ci  return setId;
438fb726d48Sopenharmony_ci}
439fb726d48Sopenharmony_ci
440fb726d48Sopenharmony_ci//查找点击的thread块前后相邻块信息
441fb726d48Sopenharmony_cifunction seacrhThreadNearData(target: unknown): void {
442fb726d48Sopenharmony_ci  //@ts-ignore
443fb726d48Sopenharmony_ci  let key = `${target.params.pid}-${target.params.tid}`;
444fb726d48Sopenharmony_ci  let preData;
445fb726d48Sopenharmony_ci  let nextData;
446fb726d48Sopenharmony_ci  let threadSlice = threadStateList.get(key) || [];
447fb726d48Sopenharmony_ci  //@ts-ignore
448fb726d48Sopenharmony_ci  let dbIndex = threadSlice.findIndex(it => it.startTime === target.params.startTime);
449fb726d48Sopenharmony_ci  if (dbIndex !== -1) {
450fb726d48Sopenharmony_ci    preData = threadSlice[dbIndex - 1] ? threadSlice[dbIndex - 1] : dataCache;
451fb726d48Sopenharmony_ci    nextData = threadSlice[dbIndex + 1] ? threadSlice[dbIndex + 1] : dataCache;
452fb726d48Sopenharmony_ci  } else {
453fb726d48Sopenharmony_ci    preData = dataCache;
454fb726d48Sopenharmony_ci    nextData = dataCache;
455fb726d48Sopenharmony_ci  }
456fb726d48Sopenharmony_ci  postMsg(target, [preData, nextData]);
457fb726d48Sopenharmony_ci}
458fb726d48Sopenharmony_ci
459fb726d48Sopenharmony_cifunction setStateData(slice: unknown, title: string): unknown {
460fb726d48Sopenharmony_ci  return {
461fb726d48Sopenharmony_ci    title: title,
462fb726d48Sopenharmony_ci    count: 1, //@ts-ignore
463fb726d48Sopenharmony_ci    state: slice.state, //@ts-ignore
464fb726d48Sopenharmony_ci    tid: slice.tid, //@ts-ignore
465fb726d48Sopenharmony_ci    pid: slice.pid, //@ts-ignore
466fb726d48Sopenharmony_ci    minDuration: slice.dur || 0, //@ts-ignore
467fb726d48Sopenharmony_ci    maxDuration: slice.dur || 0, //@ts-ignore
468fb726d48Sopenharmony_ci    wallDuration: slice.dur || 0, //@ts-ignore
469fb726d48Sopenharmony_ci    avgDuration: `${slice.dur}`,
470fb726d48Sopenharmony_ci  };
471fb726d48Sopenharmony_ci}
472fb726d48Sopenharmony_ci
473fb726d48Sopenharmony_cifunction setThreadData(slice: unknown, item: unknown): unknown {
474fb726d48Sopenharmony_ci  return {
475fb726d48Sopenharmony_ci    //@ts-ignore
476fb726d48Sopenharmony_ci    title: `T-${slice.tid}`,
477fb726d48Sopenharmony_ci    count: 1, //@ts-ignore
478fb726d48Sopenharmony_ci    tid: slice.tid, //@ts-ignore
479fb726d48Sopenharmony_ci    pid: slice.pid, //@ts-ignore
480fb726d48Sopenharmony_ci    minDuration: slice.dur || 0, //@ts-ignore
481fb726d48Sopenharmony_ci    maxDuration: slice.dur || 0, //@ts-ignore
482fb726d48Sopenharmony_ci    wallDuration: slice.dur || 0, //@ts-ignore
483fb726d48Sopenharmony_ci    avgDuration: `${slice.dur}`,
484fb726d48Sopenharmony_ci    children: [item],
485fb726d48Sopenharmony_ci  };
486fb726d48Sopenharmony_ci}
487fb726d48Sopenharmony_ci
488fb726d48Sopenharmony_cifunction setProcessData(slice: unknown, item: unknown): unknown {
489fb726d48Sopenharmony_ci  return {
490fb726d48Sopenharmony_ci    //@ts-ignore
491fb726d48Sopenharmony_ci    title: `P-${slice.pid}`,
492fb726d48Sopenharmony_ci    count: 1, //@ts-ignore
493fb726d48Sopenharmony_ci    pid: slice.pid, //@ts-ignore
494fb726d48Sopenharmony_ci    minDuration: slice.dur || 0, //@ts-ignore
495fb726d48Sopenharmony_ci    maxDuration: slice.dur || 0, //@ts-ignore
496fb726d48Sopenharmony_ci    wallDuration: slice.dur || 0, //@ts-ignore
497fb726d48Sopenharmony_ci    avgDuration: `${slice.dur}`,
498fb726d48Sopenharmony_ci    children: [
499fb726d48Sopenharmony_ci      {
500fb726d48Sopenharmony_ci        //@ts-ignore
501fb726d48Sopenharmony_ci        title: `T-${slice.tid}`,
502fb726d48Sopenharmony_ci        count: 1, //@ts-ignore
503fb726d48Sopenharmony_ci        pid: slice.pid, //@ts-ignore
504fb726d48Sopenharmony_ci        tid: slice.tid, //@ts-ignore
505fb726d48Sopenharmony_ci        minDuration: slice.dur || 0, //@ts-ignore
506fb726d48Sopenharmony_ci        maxDuration: slice.dur || 0, //@ts-ignore
507fb726d48Sopenharmony_ci        wallDuration: slice.dur || 0, //@ts-ignore
508fb726d48Sopenharmony_ci        avgDuration: `${slice.dur}`,
509fb726d48Sopenharmony_ci        children: [item],
510fb726d48Sopenharmony_ci      },
511fb726d48Sopenharmony_ci    ],
512fb726d48Sopenharmony_ci  };
513fb726d48Sopenharmony_ci}
514fb726d48Sopenharmony_ci
515fb726d48Sopenharmony_cifunction setSPTData(group: unknown, slice: unknown, item: unknown): void {
516fb726d48Sopenharmony_ci  //@ts-ignore
517fb726d48Sopenharmony_ci  let state = group[`${slice.state}`];
518fb726d48Sopenharmony_ci  state.count += 1; //@ts-ignore
519fb726d48Sopenharmony_ci  state.wallDuration += slice.dur; //@ts-ignore
520fb726d48Sopenharmony_ci  state.minDuration = Math.min(state.minDuration, slice.dur!); //@ts-ignore
521fb726d48Sopenharmony_ci  state.maxDuration = Math.max(state.maxDuration, slice.dur!);
522fb726d48Sopenharmony_ci  state.avgDuration = (state.wallDuration / state.count).toFixed(2); //@ts-ignore
523fb726d48Sopenharmony_ci  let process = state.children.find((child: unknown) => child.title === `P-${slice.pid}`);
524fb726d48Sopenharmony_ci  if (process) {
525fb726d48Sopenharmony_ci    process.count += 1; //@ts-ignore
526fb726d48Sopenharmony_ci    process.wallDuration += slice.dur; //@ts-ignore
527fb726d48Sopenharmony_ci    process.minDuration = Math.min(process.minDuration, slice.dur!); //@ts-ignore
528fb726d48Sopenharmony_ci    process.maxDuration = Math.max(process.maxDuration, slice.dur!);
529fb726d48Sopenharmony_ci    process.avgDuration = (process.wallDuration / process.count).toFixed(2); //@ts-ignore
530fb726d48Sopenharmony_ci    let thread = process.children.find((child: unknown) => child.title === `T-${slice.tid}`);
531fb726d48Sopenharmony_ci    if (thread) {
532fb726d48Sopenharmony_ci      thread.count += 1; //@ts-ignore
533fb726d48Sopenharmony_ci      thread.wallDuration += slice.dur; //@ts-ignore
534fb726d48Sopenharmony_ci      thread.minDuration = Math.min(thread.minDuration, slice.dur!); //@ts-ignore
535fb726d48Sopenharmony_ci      thread.maxDuration = Math.max(thread.maxDuration, slice.dur!);
536fb726d48Sopenharmony_ci      thread.avgDuration = (thread.wallDuration / thread.count).toFixed(2);
537fb726d48Sopenharmony_ci    } else {
538fb726d48Sopenharmony_ci      process.children.push(item);
539fb726d48Sopenharmony_ci    }
540fb726d48Sopenharmony_ci  } else {
541fb726d48Sopenharmony_ci    state.children.push({
542fb726d48Sopenharmony_ci      //@ts-ignore
543fb726d48Sopenharmony_ci      title: `P-${slice.pid}`,
544fb726d48Sopenharmony_ci      count: 1, //@ts-ignore
545fb726d48Sopenharmony_ci      state: slice.state, //@ts-ignore
546fb726d48Sopenharmony_ci      pid: slice.pid, //@ts-ignore
547fb726d48Sopenharmony_ci      minDuration: slice.dur || 0, //@ts-ignore
548fb726d48Sopenharmony_ci      maxDuration: slice.dur || 0, //@ts-ignore
549fb726d48Sopenharmony_ci      wallDuration: slice.dur || 0, //@ts-ignore
550fb726d48Sopenharmony_ci      avgDuration: `${slice.dur}`,
551fb726d48Sopenharmony_ci      children: [item],
552fb726d48Sopenharmony_ci    });
553fb726d48Sopenharmony_ci  }
554fb726d48Sopenharmony_ci}
555