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 { TraficEnum } from '../utils/QueryEnum';
15fb726d48Sopenharmony_ciimport { processFrameList } from '../utils/AllMemoryCache';
16fb726d48Sopenharmony_ciimport { Args } from '../CommonArgs';
17fb726d48Sopenharmony_ci
18fb726d48Sopenharmony_ciexport const chartProcessActualDataSql = (args: Args): string => {
19fb726d48Sopenharmony_ci  return `
20fb726d48Sopenharmony_ci  SELECT
21fb726d48Sopenharmony_ci               (a.ts - ${args.recordStartNS}) AS ts,
22fb726d48Sopenharmony_ci               a.dur,
23fb726d48Sopenharmony_ci               ${args.pid} as pid,
24fb726d48Sopenharmony_ci               a.id,
25fb726d48Sopenharmony_ci               a.vsync AS name,
26fb726d48Sopenharmony_ci               a.type,
27fb726d48Sopenharmony_ci               a.flag AS jankTag,
28fb726d48Sopenharmony_ci               a.dst AS dstSlice,
29fb726d48Sopenharmony_ci               a.depth
30fb726d48Sopenharmony_ci        FROM frame_slice AS a
31fb726d48Sopenharmony_ci        WHERE a.type = 0
32fb726d48Sopenharmony_ci          AND a.flag <> 2
33fb726d48Sopenharmony_ci          AND a.ipid in (select p.ipid from process AS p where p.pid = ${args.pid})
34fb726d48Sopenharmony_ci        ORDER BY a.ipid;`;
35fb726d48Sopenharmony_ci};
36fb726d48Sopenharmony_ci
37fb726d48Sopenharmony_ciexport const chartProcessActualProtoDataSql = (args: Args): string => {
38fb726d48Sopenharmony_ci  return `
39fb726d48Sopenharmony_ci  SELECT
40fb726d48Sopenharmony_ci               (a.ts - ${args.recordStartNS}) AS ts,
41fb726d48Sopenharmony_ci               a.dur,
42fb726d48Sopenharmony_ci               ${args.pid} as pid,
43fb726d48Sopenharmony_ci               a.id,
44fb726d48Sopenharmony_ci               a.vsync AS name,
45fb726d48Sopenharmony_ci               a.type,
46fb726d48Sopenharmony_ci               a.flag AS jankTag,
47fb726d48Sopenharmony_ci               a.dst AS dstSlice,
48fb726d48Sopenharmony_ci               a.depth,
49fb726d48Sopenharmony_ci               (a.ts - ${args.recordStartNS}) / (${Math.floor(
50fb726d48Sopenharmony_ci    (args.endNS - args.startNS) / args.width
51fb726d48Sopenharmony_ci  )}) + (a.depth * ${args.width})  AS px
52fb726d48Sopenharmony_ci        FROM frame_slice AS a
53fb726d48Sopenharmony_ci        WHERE a.type = 0
54fb726d48Sopenharmony_ci          AND a.flag <> 2
55fb726d48Sopenharmony_ci          AND a.ipid in (select p.ipid from process AS p where p.pid = ${args.pid})
56fb726d48Sopenharmony_ci          AND (a.ts - ${args.recordStartNS}) + dur >= ${Math.floor(args.startNS)}
57fb726d48Sopenharmony_ci          
58fb726d48Sopenharmony_ci          AND (a.ts - ${args.recordStartNS}) <= ${Math.floor(args.endNS)}
59fb726d48Sopenharmony_ci        group by px
60fb726d48Sopenharmony_ci        ORDER BY a.ipid;`;
61fb726d48Sopenharmony_ci};
62fb726d48Sopenharmony_ci
63fb726d48Sopenharmony_ciexport function processActualDataReceiver(data: unknown, proc: Function): void {
64fb726d48Sopenharmony_ci  //@ts-ignore
65fb726d48Sopenharmony_ci  if (data.params.trafic === TraficEnum.Memory) {
66fb726d48Sopenharmony_ci    //@ts-ignore
67fb726d48Sopenharmony_ci    if (!processFrameList.has(`${data.params.pid}_actual`)) {
68fb726d48Sopenharmony_ci      //@ts-ignore
69fb726d48Sopenharmony_ci      let sql = chartProcessActualDataSql(data.params); //@ts-ignore
70fb726d48Sopenharmony_ci      processFrameList.set(`${data.params.pid}_actual`, proc(sql));
71fb726d48Sopenharmony_ci    } //@ts-ignore
72fb726d48Sopenharmony_ci    arrayBufferHandler(data, processFrameList.get(`${data.params.pid}_actual`)!, true);
73fb726d48Sopenharmony_ci  } else {
74fb726d48Sopenharmony_ci    //@ts-ignore
75fb726d48Sopenharmony_ci    let sql = chartProcessActualProtoDataSql(data.params);
76fb726d48Sopenharmony_ci    let res = proc(sql); //@ts-ignore
77fb726d48Sopenharmony_ci    arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer);
78fb726d48Sopenharmony_ci  }
79fb726d48Sopenharmony_ci}
80fb726d48Sopenharmony_ci
81fb726d48Sopenharmony_cifunction arrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): void {
82fb726d48Sopenharmony_ci  let processActual = new ProcessActual(data, transfer, res.length);
83fb726d48Sopenharmony_ci  for (let index = 0; index < res.length; index++) {
84fb726d48Sopenharmony_ci    let itemData = res[index]; //@ts-ignore
85fb726d48Sopenharmony_ci    data.params.trafic === TraficEnum.ProtoBuffer && (itemData = itemData.processJanksActualData); //@ts-ignore
86fb726d48Sopenharmony_ci    if (!itemData.dur || itemData.dur < 0) {
87fb726d48Sopenharmony_ci      continue;
88fb726d48Sopenharmony_ci    } //@ts-ignore
89fb726d48Sopenharmony_ci    processActual.dur[index] = itemData.dur; //@ts-ignore
90fb726d48Sopenharmony_ci    processActual.ts[index] = itemData.ts; //@ts-ignore
91fb726d48Sopenharmony_ci    processActual.pid[index] = itemData.pid; //@ts-ignore
92fb726d48Sopenharmony_ci    processActual.id[index] = itemData.id; //@ts-ignore
93fb726d48Sopenharmony_ci    processActual.name[index] = itemData.name; //@ts-ignore
94fb726d48Sopenharmony_ci    processActual.type[index] = itemData.type; //@ts-ignore
95fb726d48Sopenharmony_ci    processActual.jank_tag[index] = itemData.jankTag; //@ts-ignore
96fb726d48Sopenharmony_ci    processActual.dst_slice[index] = itemData.dstSlice; //@ts-ignore
97fb726d48Sopenharmony_ci    processActual.depth[index] = itemData.depth;
98fb726d48Sopenharmony_ci  }
99fb726d48Sopenharmony_ci  postProcessActualMessage(data, transfer, processActual, res.length);
100fb726d48Sopenharmony_ci}
101fb726d48Sopenharmony_cifunction postProcessActualMessage(data: unknown, transfer: boolean, processActual: ProcessActual, len: number): void {
102fb726d48Sopenharmony_ci  (self as unknown as Worker).postMessage(
103fb726d48Sopenharmony_ci    {
104fb726d48Sopenharmony_ci      //@ts-ignore
105fb726d48Sopenharmony_ci      id: data.id, //@ts-ignore
106fb726d48Sopenharmony_ci      action: data.action,
107fb726d48Sopenharmony_ci      results: transfer
108fb726d48Sopenharmony_ci        ? {
109fb726d48Sopenharmony_ci            dur: processActual.dur.buffer,
110fb726d48Sopenharmony_ci            ts: processActual.ts.buffer,
111fb726d48Sopenharmony_ci            pid: processActual.pid.buffer,
112fb726d48Sopenharmony_ci            id: processActual.id.buffer,
113fb726d48Sopenharmony_ci            name: processActual.name.buffer,
114fb726d48Sopenharmony_ci            type: processActual.type.buffer,
115fb726d48Sopenharmony_ci            jank_tag: processActual.jank_tag.buffer,
116fb726d48Sopenharmony_ci            dst_slice: processActual.dst_slice.buffer,
117fb726d48Sopenharmony_ci            depth: processActual.depth.buffer,
118fb726d48Sopenharmony_ci          }
119fb726d48Sopenharmony_ci        : {},
120fb726d48Sopenharmony_ci      len: len,
121fb726d48Sopenharmony_ci      transfer: transfer,
122fb726d48Sopenharmony_ci    },
123fb726d48Sopenharmony_ci    transfer
124fb726d48Sopenharmony_ci      ? [
125fb726d48Sopenharmony_ci          processActual.dur.buffer,
126fb726d48Sopenharmony_ci          processActual.ts.buffer,
127fb726d48Sopenharmony_ci          processActual.pid.buffer,
128fb726d48Sopenharmony_ci          processActual.type.buffer,
129fb726d48Sopenharmony_ci          processActual.id.buffer,
130fb726d48Sopenharmony_ci          processActual.name.buffer,
131fb726d48Sopenharmony_ci          processActual.jank_tag.buffer,
132fb726d48Sopenharmony_ci          processActual.dst_slice.buffer,
133fb726d48Sopenharmony_ci          processActual.depth.buffer,
134fb726d48Sopenharmony_ci        ]
135fb726d48Sopenharmony_ci      : []
136fb726d48Sopenharmony_ci  );
137fb726d48Sopenharmony_ci}
138fb726d48Sopenharmony_ciclass ProcessActual {
139fb726d48Sopenharmony_ci  ts: Float64Array;
140fb726d48Sopenharmony_ci  dur: Float64Array;
141fb726d48Sopenharmony_ci  pid: Int32Array;
142fb726d48Sopenharmony_ci  id: Int32Array;
143fb726d48Sopenharmony_ci  name: Int32Array;
144fb726d48Sopenharmony_ci  type: Int32Array;
145fb726d48Sopenharmony_ci  jank_tag: Int32Array;
146fb726d48Sopenharmony_ci  dst_slice: Int32Array;
147fb726d48Sopenharmony_ci  depth: Uint16Array;
148fb726d48Sopenharmony_ci  constructor(data: unknown, transfer: boolean, len: number) {
149fb726d48Sopenharmony_ci    //@ts-ignore
150fb726d48Sopenharmony_ci    this.ts = new Float64Array(transfer ? len : data.params.sharedArrayBuffers.ts); //@ts-ignore
151fb726d48Sopenharmony_ci    this.dur = new Float64Array(transfer ? len : data.params.sharedArrayBuffers.dur); //@ts-ignore
152fb726d48Sopenharmony_ci    this.pid = new Int32Array(transfer ? len : data.params.sharedArrayBuffers.pid); //@ts-ignore
153fb726d48Sopenharmony_ci    this.id = new Int32Array(transfer ? len : data.params.sharedArrayBuffers.id); //@ts-ignore
154fb726d48Sopenharmony_ci    this.name = new Int32Array(transfer ? len : data.params.sharedArrayBuffers.name); //@ts-ignore
155fb726d48Sopenharmony_ci    this.type = new Int32Array(transfer ? len : data.params.sharedArrayBuffers.type); //@ts-ignore
156fb726d48Sopenharmony_ci    this.jank_tag = new Int32Array(transfer ? len : data.params.sharedArrayBuffers.jank_tag); //@ts-ignore
157fb726d48Sopenharmony_ci    this.dst_slice = new Int32Array(transfer ? len : data.params.sharedArrayBuffers.dst_slice); //@ts-ignore
158fb726d48Sopenharmony_ci    this.depth = new Uint16Array(transfer ? len : data.params.sharedArrayBuffers.depth);
159fb726d48Sopenharmony_ci  }
160fb726d48Sopenharmony_ci}
161