• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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