import { TraficEnum } from './utils/QueryEnum';
import { clockList, hangList } from './utils/AllMemoryCache';
import { Args } from './CommonArgs';
export const chartHangDataSql = (args: Args): string => `
SELECT
c.id as id,
c.ts - r.start_ts as startTime,
c.dur as dur,
t.tid as tid,
t.name as tname,
p.pid as pid,
p.name as pname
FROM
callstack c, trace_range r
LEFT JOIN thread t ON
t.itid = c.callid
LEFT JOIN process p ON
p.ipid = t.ipid
WHERE
c.dur >= ${args.minDur}
AND c.name LIKE 'H:Et:%'
AND t.is_main_thread = 1
AND p.pid = ${args.pid}
`.trim();
export interface HangSQLStruct {
id: number;
startTime: number;
dur: number;
tid: number;
pid: number;
}
export function hangDataReceiver(data: unknown, proc: Function): void {
if (data.params.trafic === TraficEnum.Memory) {
let res: HangSQLStruct[];
let list: HangSQLStruct[];
if (!hangList.has(data.params.pid)) {
let sql = chartHangDataSql(data.params);
list = proc(sql);
hangList.set(data.params.pid, list);
}
else {
list = hangList.get(data.params.pid) || [];
}
if (data.params.queryAll) {
res = list.filter(
(it) => it.startTime + it.dur >= data.params.selectStartNS && it.startTime <= data.params.selectEndNS
);
}
else {
res = list;
}
arrayBufferHandler(data, res, true);
}
else {
let sql = chartHangDataSql(data.params);
let res: HangSQLStruct[] = proc(sql);
arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer);
}
}
function arrayBufferHandler(data: unknown, res: HangSQLStruct[], transfer: boolean = true): void {
let id = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.id);
let startTime = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.startTime);
let dur = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.dur);
let tid = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.tid);
let pid = new Int32Array(transfer ? res.length : data.params.sharedArrayBuffers.pid);
res.forEach((it, i) => {
id[i] = it.id;
startTime[i] = it.startTime;
dur[i] = it.dur;
tid[i] = it.tid;
pid[i] = it.pid;
});
let arg1 = {
id: data.id,
action: data.action,
results: {
id: id.buffer,
startTime: startTime.buffer,
dur: dur.buffer,
tid: tid.buffer,
pid: pid.buffer,
},
len: res.length,
transfer: transfer,
};
let arg2 = [
id.buffer,
startTime.buffer,
dur.buffer,
tid.buffer,
pid.buffer,
];
(self as unknown as Worker).postMessage(
arg1, arg2,
);
}