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 { BaseStruct } from '../../ui-worker/ProcedureWorkerCommon';
17fb726d48Sopenharmony_ciimport { Args } from '../CommonArgs';
18fb726d48Sopenharmony_ci
19fb726d48Sopenharmony_ciexport const chartProcessExpectedDataSql = (args: Args): string => {
20fb726d48Sopenharmony_ci  const recordStartNS = args.recordStartNS;
21fb726d48Sopenharmony_ci  const pid = args.pid;
22fb726d48Sopenharmony_ci  return `
23fb726d48Sopenharmony_ci  SELECT 
24fb726d48Sopenharmony_ci         (a.ts - ${recordStartNS}) AS ts,
25fb726d48Sopenharmony_ci         a.dur,
26fb726d48Sopenharmony_ci         ${pid} as pid,
27fb726d48Sopenharmony_ci         a.id,
28fb726d48Sopenharmony_ci         a.vsync              as name,
29fb726d48Sopenharmony_ci         a.type,
30fb726d48Sopenharmony_ci         a.depth
31fb726d48Sopenharmony_ci  FROM frame_slice AS a
32fb726d48Sopenharmony_ci  WHERE a.type = 1
33fb726d48Sopenharmony_ci    and (a.flag <> 2 or a.flag is null)
34fb726d48Sopenharmony_ci    and a.ipid in (select p.ipid from process AS p where p.pid = ${pid})
35fb726d48Sopenharmony_ci  ORDER BY a.ipid`;
36fb726d48Sopenharmony_ci};
37fb726d48Sopenharmony_ci
38fb726d48Sopenharmony_ciexport const chartProcessExpectedProtoDataSql = (args: Args): string => {
39fb726d48Sopenharmony_ci  const endNS = args.endNS;
40fb726d48Sopenharmony_ci  const startNS = args.startNS;
41fb726d48Sopenharmony_ci  const recordStartNS = args.recordStartNS;
42fb726d48Sopenharmony_ci  const pid = args.pid;
43fb726d48Sopenharmony_ci  const width = args.width;
44fb726d48Sopenharmony_ci  return `
45fb726d48Sopenharmony_ci  SELECT 
46fb726d48Sopenharmony_ci         (a.ts - ${startNS}) AS ts,
47fb726d48Sopenharmony_ci         a.dur,
48fb726d48Sopenharmony_ci         ${pid} as pid,
49fb726d48Sopenharmony_ci         a.id,
50fb726d48Sopenharmony_ci         a.vsync              as name,
51fb726d48Sopenharmony_ci         a.type,
52fb726d48Sopenharmony_ci         a.depth,
53fb726d48Sopenharmony_ci         (a.ts - ${recordStartNS}) / (${Math.floor((endNS - startNS) / width)}) + (a.depth * ${width})  AS px
54fb726d48Sopenharmony_ci  FROM frame_slice AS a
55fb726d48Sopenharmony_ci  WHERE a.type = 1
56fb726d48Sopenharmony_ci    and (a.flag <> 2 or a.flag is null)
57fb726d48Sopenharmony_ci    and a.ipid in (select p.ipid from process AS p where p.pid = ${pid})
58fb726d48Sopenharmony_ci    and (a.ts - ${recordStartNS} + a.dur) >= ${Math.floor(startNS)}
59fb726d48Sopenharmony_ci    and (a.ts - ${recordStartNS}) <= ${Math.floor(endNS)}
60fb726d48Sopenharmony_ci  group by px
61fb726d48Sopenharmony_ci  ORDER BY a.ipid;`;
62fb726d48Sopenharmony_ci};
63fb726d48Sopenharmony_ci
64fb726d48Sopenharmony_ciexport function processExpectedDataReceiver(data: unknown, proc: Function): void {
65fb726d48Sopenharmony_ci  //@ts-ignore
66fb726d48Sopenharmony_ci  if (data.params.trafic === TraficEnum.Memory) {
67fb726d48Sopenharmony_ci    //@ts-ignore
68fb726d48Sopenharmony_ci    if (!processFrameList.has(`${data.params.pid}_expected`)) {
69fb726d48Sopenharmony_ci      //@ts-ignore
70fb726d48Sopenharmony_ci      let sql = chartProcessExpectedDataSql(data.params); //@ts-ignore
71fb726d48Sopenharmony_ci      processFrameList.set(`${data.params.pid}_expected`, proc(sql));
72fb726d48Sopenharmony_ci    } //@ts-ignore
73fb726d48Sopenharmony_ci    arrayBufferHandler(data, processFrameList.get(`${data.params.pid}_expected`)!, true);
74fb726d48Sopenharmony_ci  } else {
75fb726d48Sopenharmony_ci    //@ts-ignore
76fb726d48Sopenharmony_ci    let sql = chartProcessExpectedProtoDataSql(data.params as BaseStruct);
77fb726d48Sopenharmony_ci    let res = proc(sql); //@ts-ignore
78fb726d48Sopenharmony_ci    arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer);
79fb726d48Sopenharmony_ci  }
80fb726d48Sopenharmony_ci}
81fb726d48Sopenharmony_ci
82fb726d48Sopenharmony_cifunction arrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): void {
83fb726d48Sopenharmony_ci  //@ts-ignore
84fb726d48Sopenharmony_ci  let ts = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.ts); //@ts-ignore
85fb726d48Sopenharmony_ci  let dur = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.dur); //@ts-ignore
86fb726d48Sopenharmony_ci  let pid = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.pid); //@ts-ignore
87fb726d48Sopenharmony_ci  let id = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.id); //@ts-ignore
88fb726d48Sopenharmony_ci  let name = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.name); //@ts-ignore
89fb726d48Sopenharmony_ci  let type = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.type); //@ts-ignore
90fb726d48Sopenharmony_ci  let depth = new Uint16Array(transfer ? res.length : data.params.sharedArrayBuffers.depth);
91fb726d48Sopenharmony_ci  for (let index = 0; index < res.length; index++) {
92fb726d48Sopenharmony_ci    let itemData = res[index]; //@ts-ignore
93fb726d48Sopenharmony_ci    data.params.trafic === TraficEnum.ProtoBuffer && (itemData = itemData.processJanksFramesData); //@ts-ignore
94fb726d48Sopenharmony_ci    dur[index] = itemData.dur; //@ts-ignore
95fb726d48Sopenharmony_ci    ts[index] = itemData.ts; //@ts-ignore
96fb726d48Sopenharmony_ci    pid[index] = itemData.pid; //@ts-ignore
97fb726d48Sopenharmony_ci    id[index] = itemData.id; //@ts-ignore
98fb726d48Sopenharmony_ci    name[index] = itemData.name; //@ts-ignore
99fb726d48Sopenharmony_ci    type[index] = itemData.type; //@ts-ignore
100fb726d48Sopenharmony_ci    depth[index] = itemData.depth;
101fb726d48Sopenharmony_ci  }
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: dur.buffer,
110fb726d48Sopenharmony_ci            ts: ts.buffer,
111fb726d48Sopenharmony_ci            pid: pid.buffer,
112fb726d48Sopenharmony_ci            id: id.buffer,
113fb726d48Sopenharmony_ci            name: name.buffer,
114fb726d48Sopenharmony_ci            type: name.buffer,
115fb726d48Sopenharmony_ci            depth: depth.buffer,
116fb726d48Sopenharmony_ci          }
117fb726d48Sopenharmony_ci        : {},
118fb726d48Sopenharmony_ci      len: res.length,
119fb726d48Sopenharmony_ci      transfer: transfer,
120fb726d48Sopenharmony_ci    },
121fb726d48Sopenharmony_ci    transfer ? [dur.buffer, ts.buffer, pid.buffer, type.buffer, id.buffer, name.buffer, depth.buffer] : []
122fb726d48Sopenharmony_ci  );
123fb726d48Sopenharmony_ci}
124