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 { TraficEnum } from '../utils/QueryEnum';
16fb726d48Sopenharmony_ci
17fb726d48Sopenharmony_ciexport const chartProcessDeliverInputEventDataSql = (args: Args): string => {
18fb726d48Sopenharmony_ci  return `select  
19fb726d48Sopenharmony_ci      c.ts-${args.recordStartNS} as startTs,
20fb726d48Sopenharmony_ci      c.dur,
21fb726d48Sopenharmony_ci      c.argsetid,
22fb726d48Sopenharmony_ci      tid,
23fb726d48Sopenharmony_ci      P.pid,
24fb726d48Sopenharmony_ci      is_main_thread as isMainThread,
25fb726d48Sopenharmony_ci      c.callid as trackId,
26fb726d48Sopenharmony_ci      c.parent_id as parentId,
27fb726d48Sopenharmony_ci      c.id,
28fb726d48Sopenharmony_ci      c.cookie,
29fb726d48Sopenharmony_ci      c.depth,
30fb726d48Sopenharmony_ci      ((c.ts - ${args.recordStartNS}) / (${Math.floor((args.endNS - args.startNS) / args.width)})) AS px,
31fb726d48Sopenharmony_ci      c.name as funName,
32fb726d48Sopenharmony_ci      A.name as threadName
33fb726d48Sopenharmony_ci  from thread A
34fb726d48Sopenharmony_ci  left join process P on P.id = A.ipid
35fb726d48Sopenharmony_ci  left join callstack C on A.id = C.callid
36fb726d48Sopenharmony_ci  where startTs not null and cookie not null
37fb726d48Sopenharmony_ci  and c.name ='deliverInputEvent'
38fb726d48Sopenharmony_ci  and tid = ${args.tid}
39fb726d48Sopenharmony_ci  and startTs + dur >= ${Math.floor(args.startNS)}
40fb726d48Sopenharmony_ci  and startTs <= ${Math.floor(args.endNS)}
41fb726d48Sopenharmony_ci    group by px;
42fb726d48Sopenharmony_ci  `;
43fb726d48Sopenharmony_ci};
44fb726d48Sopenharmony_ci
45fb726d48Sopenharmony_ciexport function processDeliverInputEventDataReceiver(data: unknown, proc: Function): void {
46fb726d48Sopenharmony_ci  //@ts-ignore
47fb726d48Sopenharmony_ci  let sql = chartProcessDeliverInputEventDataSql(data.params);
48fb726d48Sopenharmony_ci  let res = proc(sql); //@ts-ignore
49fb726d48Sopenharmony_ci  arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer);
50fb726d48Sopenharmony_ci}
51fb726d48Sopenharmony_ci
52fb726d48Sopenharmony_cifunction arrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): void {
53fb726d48Sopenharmony_ci  let processDeliverInputEvent = new ProcessDeliverInputEvent(data, transfer, res.length);
54fb726d48Sopenharmony_ci  res.forEach((it, i) => {
55fb726d48Sopenharmony_ci    //@ts-ignore
56fb726d48Sopenharmony_ci    data.params.trafic === TraficEnum.ProtoBuffer && (it = it.processInputEventData); //@ts-ignore
57fb726d48Sopenharmony_ci    processDeliverInputEvent.tid[i] = it.tid; //@ts-ignore
58fb726d48Sopenharmony_ci    processDeliverInputEvent.dur[i] = it.dur; //@ts-ignore
59fb726d48Sopenharmony_ci    processDeliverInputEvent.is_main_thread[i] = it.isMainThread; //@ts-ignore
60fb726d48Sopenharmony_ci    processDeliverInputEvent.track_id[i] = it.trackId; //@ts-ignore
61fb726d48Sopenharmony_ci    processDeliverInputEvent.startTs[i] = it.startTs; //@ts-ignore
62fb726d48Sopenharmony_ci    processDeliverInputEvent.pid[i] = it.pid; //@ts-ignore
63fb726d48Sopenharmony_ci    processDeliverInputEvent.parent_id[i] = it.parentId; //@ts-ignore
64fb726d48Sopenharmony_ci    processDeliverInputEvent.id[i] = it.id; //@ts-ignore
65fb726d48Sopenharmony_ci    processDeliverInputEvent.cookie[i] = it.cookie; //@ts-ignore
66fb726d48Sopenharmony_ci    processDeliverInputEvent.depth[i] = it.depth; //@ts-ignore
67fb726d48Sopenharmony_ci    processDeliverInputEvent.argsetid[i] = it.argsetid;
68fb726d48Sopenharmony_ci  });
69fb726d48Sopenharmony_ci  postMessage(data, transfer, processDeliverInputEvent, res.length);
70fb726d48Sopenharmony_ci}
71fb726d48Sopenharmony_ci
72fb726d48Sopenharmony_cifunction postMessage(
73fb726d48Sopenharmony_ci  data: unknown,
74fb726d48Sopenharmony_ci  transfer: boolean,
75fb726d48Sopenharmony_ci  processDeliverInputEvent: ProcessDeliverInputEvent,
76fb726d48Sopenharmony_ci  len: number
77fb726d48Sopenharmony_ci): void {
78fb726d48Sopenharmony_ci  (self as unknown as Worker).postMessage(
79fb726d48Sopenharmony_ci    {
80fb726d48Sopenharmony_ci      transfer: transfer, //@ts-ignore
81fb726d48Sopenharmony_ci      id: data.id, //@ts-ignore
82fb726d48Sopenharmony_ci      action: data.action,
83fb726d48Sopenharmony_ci      results: transfer
84fb726d48Sopenharmony_ci        ? {
85fb726d48Sopenharmony_ci            tid: processDeliverInputEvent.tid.buffer,
86fb726d48Sopenharmony_ci            dur: processDeliverInputEvent.dur.buffer,
87fb726d48Sopenharmony_ci            is_main_thread: processDeliverInputEvent.is_main_thread.buffer,
88fb726d48Sopenharmony_ci            track_id: processDeliverInputEvent.track_id.buffer,
89fb726d48Sopenharmony_ci            startTs: processDeliverInputEvent.startTs.buffer,
90fb726d48Sopenharmony_ci            pid: processDeliverInputEvent.pid.buffer,
91fb726d48Sopenharmony_ci            parent_id: processDeliverInputEvent.parent_id.buffer,
92fb726d48Sopenharmony_ci            id: processDeliverInputEvent.id.buffer,
93fb726d48Sopenharmony_ci            cookie: processDeliverInputEvent.cookie.buffer,
94fb726d48Sopenharmony_ci            depth: processDeliverInputEvent.depth.buffer,
95fb726d48Sopenharmony_ci            argsetid: processDeliverInputEvent.argsetid.buffer,
96fb726d48Sopenharmony_ci          }
97fb726d48Sopenharmony_ci        : {},
98fb726d48Sopenharmony_ci      len: len,
99fb726d48Sopenharmony_ci    },
100fb726d48Sopenharmony_ci    transfer
101fb726d48Sopenharmony_ci      ? [
102fb726d48Sopenharmony_ci          processDeliverInputEvent.tid.buffer,
103fb726d48Sopenharmony_ci          processDeliverInputEvent.dur.buffer,
104fb726d48Sopenharmony_ci          processDeliverInputEvent.is_main_thread.buffer,
105fb726d48Sopenharmony_ci          processDeliverInputEvent.track_id.buffer,
106fb726d48Sopenharmony_ci          processDeliverInputEvent.startTs.buffer,
107fb726d48Sopenharmony_ci          processDeliverInputEvent.pid.buffer,
108fb726d48Sopenharmony_ci          processDeliverInputEvent.parent_id.buffer,
109fb726d48Sopenharmony_ci          processDeliverInputEvent.id.buffer,
110fb726d48Sopenharmony_ci          processDeliverInputEvent.cookie.buffer,
111fb726d48Sopenharmony_ci          processDeliverInputEvent.depth.buffer,
112fb726d48Sopenharmony_ci          processDeliverInputEvent.argsetid.buffer,
113fb726d48Sopenharmony_ci        ]
114fb726d48Sopenharmony_ci      : []
115fb726d48Sopenharmony_ci  );
116fb726d48Sopenharmony_ci}
117fb726d48Sopenharmony_ciclass ProcessDeliverInputEvent {
118fb726d48Sopenharmony_ci  tid: Int32Array;
119fb726d48Sopenharmony_ci  pid: Int32Array;
120fb726d48Sopenharmony_ci  is_main_thread: Int8Array;
121fb726d48Sopenharmony_ci  track_id: Int32Array;
122fb726d48Sopenharmony_ci  startTs: Float64Array;
123fb726d48Sopenharmony_ci  dur: Float64Array;
124fb726d48Sopenharmony_ci  parent_id: Int32Array;
125fb726d48Sopenharmony_ci  id: Int32Array;
126fb726d48Sopenharmony_ci  cookie: Int32Array;
127fb726d48Sopenharmony_ci  depth: Int32Array;
128fb726d48Sopenharmony_ci  argsetid: Int32Array;
129fb726d48Sopenharmony_ci  constructor(data: unknown, transfer: boolean, len: number) {
130fb726d48Sopenharmony_ci    //@ts-ignore
131fb726d48Sopenharmony_ci    this.tid = new Int32Array(transfer ? len : data.params.sharedArrayBuffers.tid); //@ts-ignore
132fb726d48Sopenharmony_ci    this.pid = new Int32Array(transfer ? len : data.params.sharedArrayBuffers.pid); //@ts-ignore
133fb726d48Sopenharmony_ci    this.is_main_thread = new Int8Array(transfer ? len : data.params.sharedArrayBuffers.is_main_thread); //@ts-ignore
134fb726d48Sopenharmony_ci    this.track_id = new Int32Array(transfer ? len : data.params.sharedArrayBuffers.track_id); //@ts-ignore
135fb726d48Sopenharmony_ci    this.startTs = new Float64Array(transfer ? len : data.params.sharedArrayBuffers.startTs); //@ts-ignore
136fb726d48Sopenharmony_ci    this.dur = new Float64Array(transfer ? len : data.params.sharedArrayBuffers.dur); //@ts-ignore
137fb726d48Sopenharmony_ci    this.parent_id = new Int32Array(transfer ? len : data.params.sharedArrayBuffers.parent_id); //@ts-ignore
138fb726d48Sopenharmony_ci    this.id = new Int32Array(transfer ? len : data.params.sharedArrayBuffers.id); //@ts-ignore
139fb726d48Sopenharmony_ci    this.cookie = new Int32Array(transfer ? len : data.params.sharedArrayBuffers.cookie); //@ts-ignore
140fb726d48Sopenharmony_ci    this.depth = new Int32Array(transfer ? len : data.params.sharedArrayBuffers.depth); //@ts-ignore
141fb726d48Sopenharmony_ci    this.argsetid = new Int32Array(transfer ? len : data.params.sharedArrayBuffers.argsetid);
142fb726d48Sopenharmony_ci  }
143fb726d48Sopenharmony_ci}
144