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 { filterDataByGroup } from './utils/DataFilter';
16fb726d48Sopenharmony_ciimport { lrqList } from './utils/AllMemoryCache';
17fb726d48Sopenharmony_ciimport { Args } from './CommonArgs';
18fb726d48Sopenharmony_ci
19fb726d48Sopenharmony_ciexport const chartIrqDataSql = (args: Args): string => {
20fb726d48Sopenharmony_ci  if (args.name === 'irq') {
21fb726d48Sopenharmony_ci    return `
22fb726d48Sopenharmony_ci        select i.ts - ${args.recordStartNS
23fb726d48Sopenharmony_ci      }                                                                                                   as startNs,
24fb726d48Sopenharmony_ci               max(i.dur)                                                                                       as dur,
25fb726d48Sopenharmony_ci               i.depth,
26fb726d48Sopenharmony_ci               ifnull(argsetid, -1)                                                                         as argSetId,
27fb726d48Sopenharmony_ci               i.id,
28fb726d48Sopenharmony_ci               ((i.ts - ${args.recordStartNS}) / (${Math.floor((args.endNS - args.startNS) / args.width)})) as px
29fb726d48Sopenharmony_ci        from irq i
30fb726d48Sopenharmony_ci        where i.callid = ${args.cpu}
31fb726d48Sopenharmony_ci          and ((i.cat = 'irq' and i.flag = '1') or i.cat = 'ipi')
32fb726d48Sopenharmony_ci          and startNs + dur >= ${Math.floor(args.startNS)}
33fb726d48Sopenharmony_ci          and startNs <= ${Math.floor(args.endNS)}
34fb726d48Sopenharmony_ci        group by px;
35fb726d48Sopenharmony_ci    `;
36fb726d48Sopenharmony_ci  } else {
37fb726d48Sopenharmony_ci    return `
38fb726d48Sopenharmony_ci        select i.ts - ${args.recordStartNS}                                                                 as startNs,
39fb726d48Sopenharmony_ci               max(i.dur)                                                                                       as dur,
40fb726d48Sopenharmony_ci               i.depth,
41fb726d48Sopenharmony_ci               ifnull(argsetid,-1)                                                                            as argSetId,
42fb726d48Sopenharmony_ci               i.id,
43fb726d48Sopenharmony_ci               ((i.ts - ${args.recordStartNS}) / (${Math.floor((args.endNS - args.startNS) / args.width)})) as px
44fb726d48Sopenharmony_ci        from irq i
45fb726d48Sopenharmony_ci        where i.callid = ${args.cpu}
46fb726d48Sopenharmony_ci          and i.cat = 'softirq'
47fb726d48Sopenharmony_ci          and startNs + dur >= ${Math.floor(args.startNS)}
48fb726d48Sopenharmony_ci          and startNs <= ${Math.floor(args.endNS)}
49fb726d48Sopenharmony_ci        group by px;
50fb726d48Sopenharmony_ci    `;
51fb726d48Sopenharmony_ci  }
52fb726d48Sopenharmony_ci};
53fb726d48Sopenharmony_ci
54fb726d48Sopenharmony_ciexport const chartIrqDataSqlMem = (args: Args): string => {
55fb726d48Sopenharmony_ci  if (args.name === 'irq') {
56fb726d48Sopenharmony_ci    return `
57fb726d48Sopenharmony_ci        select i.ts - t.start_ts as startNs,i.dur,
58fb726d48Sopenharmony_ci        case when i.cat = 'ipi' then 'IPI' || i.name else i.name end as name,
59fb726d48Sopenharmony_ci        i.depth,
60fb726d48Sopenharmony_ci        ifnull(argsetid, -1) as argSetId,
61fb726d48Sopenharmony_ci        i.id 
62fb726d48Sopenharmony_ci        from irq i,trace_range t 
63fb726d48Sopenharmony_ci        where i.callid = ${args.cpu} and ((i.cat = 'irq' and i.flag ='1') or i.cat = 'ipi') 
64fb726d48Sopenharmony_ci    `;
65fb726d48Sopenharmony_ci  } else {
66fb726d48Sopenharmony_ci    return `
67fb726d48Sopenharmony_ci        select i.ts - t.start_ts as startNs,i.dur,i.name,i.depth,ifnull(argsetid, -1) as argSetId,i.id from irq i,
68fb726d48Sopenharmony_citrace_range t where i.callid = ${args.cpu} and i.cat = 'softirq'
69fb726d48Sopenharmony_ci    `;
70fb726d48Sopenharmony_ci  }
71fb726d48Sopenharmony_ci};
72fb726d48Sopenharmony_ci
73fb726d48Sopenharmony_ciexport function irqDataReceiver(data: unknown, proc: Function): void {
74fb726d48Sopenharmony_ci  // @ts-ignore
75fb726d48Sopenharmony_ci  if (data.params.trafic === TraficEnum.Memory) {
76fb726d48Sopenharmony_ci    let res: unknown[];
77fb726d48Sopenharmony_ci    let list: unknown[];
78fb726d48Sopenharmony_ci    // @ts-ignore
79fb726d48Sopenharmony_ci    if (!lrqList.has(data.params.cpu + data.params.name)) {
80fb726d48Sopenharmony_ci      // @ts-ignore
81fb726d48Sopenharmony_ci      list = proc(chartIrqDataSqlMem(data.params));
82fb726d48Sopenharmony_ci      // @ts-ignore
83fb726d48Sopenharmony_ci      lrqList.set(data.params.cpu + data.params.name, list);
84fb726d48Sopenharmony_ci    } else {
85fb726d48Sopenharmony_ci      // @ts-ignore
86fb726d48Sopenharmony_ci      list = lrqList.get(data.params.cpu + data.params.name) || [];
87fb726d48Sopenharmony_ci    }
88fb726d48Sopenharmony_ci    // @ts-ignore
89fb726d48Sopenharmony_ci    res = filterDataByGroup(list || [], 'startNs', 'dur', data.params.startNS, data.params.endNS, data.params.width);
90fb726d48Sopenharmony_ci    arrayBufferHandler(data, res, true);
91fb726d48Sopenharmony_ci  } else {
92fb726d48Sopenharmony_ci    // @ts-ignore
93fb726d48Sopenharmony_ci    let sql = chartIrqDataSql(data.params);
94fb726d48Sopenharmony_ci    let res = proc(sql);
95fb726d48Sopenharmony_ci    // @ts-ignore
96fb726d48Sopenharmony_ci    arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer);
97fb726d48Sopenharmony_ci  }
98fb726d48Sopenharmony_ci}
99fb726d48Sopenharmony_ci
100fb726d48Sopenharmony_cifunction arrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): void {
101fb726d48Sopenharmony_ci  // @ts-ignore
102fb726d48Sopenharmony_ci  let startNS = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.startNS);
103fb726d48Sopenharmony_ci  // @ts-ignore
104fb726d48Sopenharmony_ci  let dur = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.dur);
105fb726d48Sopenharmony_ci  // @ts-ignore
106fb726d48Sopenharmony_ci  let depth = new Uint32Array(transfer ? res.length : data.params.sharedArrayBuffers.depth);
107fb726d48Sopenharmony_ci  // @ts-ignore
108fb726d48Sopenharmony_ci  let argSetId = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.argSetId);
109fb726d48Sopenharmony_ci  // @ts-ignore
110fb726d48Sopenharmony_ci  let id = new Uint32Array(transfer ? res.length : data.params.sharedArrayBuffers.id);
111fb726d48Sopenharmony_ci  res.forEach((it, i) => {
112fb726d48Sopenharmony_ci    // @ts-ignore
113fb726d48Sopenharmony_ci    data.params.trafic === TraficEnum.ProtoBuffer && (it = it.irqData);
114fb726d48Sopenharmony_ci    // @ts-ignore
115fb726d48Sopenharmony_ci    startNS[i] = it.startNs;
116fb726d48Sopenharmony_ci    // @ts-ignore
117fb726d48Sopenharmony_ci    dur[i] = it.dur;
118fb726d48Sopenharmony_ci    // @ts-ignore
119fb726d48Sopenharmony_ci    depth[i] = it.depth;
120fb726d48Sopenharmony_ci    // @ts-ignore
121fb726d48Sopenharmony_ci    argSetId[i] = it.argSetId;
122fb726d48Sopenharmony_ci    // @ts-ignore
123fb726d48Sopenharmony_ci    id[i] = it.id;
124fb726d48Sopenharmony_ci  });
125fb726d48Sopenharmony_ci  (self as unknown as Worker).postMessage(
126fb726d48Sopenharmony_ci    {
127fb726d48Sopenharmony_ci      // @ts-ignore
128fb726d48Sopenharmony_ci      id: data.id,
129fb726d48Sopenharmony_ci      // @ts-ignore
130fb726d48Sopenharmony_ci      action: data.action,
131fb726d48Sopenharmony_ci      results: transfer
132fb726d48Sopenharmony_ci        ? {
133fb726d48Sopenharmony_ci          startNS: startNS.buffer,
134fb726d48Sopenharmony_ci          dur: dur.buffer,
135fb726d48Sopenharmony_ci          depth: depth.buffer,
136fb726d48Sopenharmony_ci          argSetId: argSetId.buffer,
137fb726d48Sopenharmony_ci          id: id.buffer,
138fb726d48Sopenharmony_ci        }
139fb726d48Sopenharmony_ci        : {},
140fb726d48Sopenharmony_ci      len: res.length,
141fb726d48Sopenharmony_ci      transfer: transfer,
142fb726d48Sopenharmony_ci    },
143fb726d48Sopenharmony_ci    transfer ? [startNS.buffer, dur.buffer, depth.buffer, argSetId.buffer, id.buffer] : []
144fb726d48Sopenharmony_ci  );
145fb726d48Sopenharmony_ci}
146