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