From 52adc5708179f0842f75c41663e8aeea9ba3f3b7 Mon Sep 17 00:00:00 2001 From: zhangyan Date: Fri, 19 Jul 2024 11:51:39 +0800 Subject: [PATCH] =?UTF-8?q?feat:=E7=9B=B8=E5=85=B3Tab=E9=A1=B5=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E8=B7=B3=E8=BD=AC=E7=82=B9=E5=87=BB=E7=BB=98=E5=88=B6?= =?UTF-8?q?=E6=97=97=E5=B8=9C=E5=8F=8A=E6=95=B0=E6=8D=AE=E6=BA=90=E4=BF=AE?= =?UTF-8?q?=E6=94=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhangyan --- ide/src/base-ui/table/lit-table.ts | 32 ++++ ide/src/trace/bean/BoxSelection.ts | 18 +- ide/src/trace/component/StackBar.ts | 12 +- .../trace/component/trace/base/TraceSheet.ts | 70 ++++++-- .../component/trace/base/TraceSheetConfig.ts | 5 + .../trace/sheet/TabPaneCurrentSelection.ts | 12 +- .../trace/sheet/cpu/TabPaneBoxChild.ts | 95 ++++++---- .../component/trace/sheet/cpu/TabPanePTS.ts | 2 +- .../component/trace/sheet/cpu/TabPaneSPT.ts | 2 +- .../trace/sheet/process/TabPaneSliceChild.ts | 166 ++++++++++++++++++ .../trace/sheet/process/TabPaneSlices.ts | 6 +- .../sheet/process/TabPaneThreadStates.ts | 118 +++---------- .../database/data-trafic/SliceReceiver.ts | 132 +++++++++++++- .../trace/database/data-trafic/SliceSender.ts | 42 +++++ .../data-trafic/utils/ExecProtoForWorker.ts | 4 +- .../database/data-trafic/utils/QueryEnum.ts | 2 + ide/src/trace/database/sql/Func.sql.ts | 56 ++++++ .../trace/database/sql/ProcessThread.sql.ts | 101 ----------- 18 files changed, 614 insertions(+), 261 deletions(-) create mode 100644 ide/src/trace/component/trace/sheet/process/TabPaneSliceChild.ts diff --git a/ide/src/base-ui/table/lit-table.ts b/ide/src/base-ui/table/lit-table.ts index 8a3111ec6..59a611ccd 100644 --- a/ide/src/base-ui/table/lit-table.ts +++ b/ide/src/base-ui/table/lit-table.ts @@ -945,6 +945,7 @@ export class LitTable extends HTMLElement { td = this.firstElementTdHandler(rowTreeElement, dataIndex, rowData, column); } else { td = this.otherElementHandler(dataIndex, rowData, column); // @ts-ignore + this.dispatchTdClickEvent(td, column, rowData);// @ts-ignore rowTreeElement.append(td); } }); @@ -1114,6 +1115,8 @@ export class LitTable extends HTMLElement { // @ts-ignore let dataIndex = column.getAttribute('data-index') || '1'; let td = this.createColumnTd(dataIndex, column, rowData); + //@ts-ignore + this.dispatchTdClickEvent(td, column, rowData); newTableElement.append(td); }); newTableElement.onmouseup = (e: MouseEvent): void => { @@ -1521,6 +1524,28 @@ export class LitTable extends HTMLElement { }; } + //自定义td点击事件 + dispatchTdClickEvent(td: unknown, column: any, rowData: unknown): void { + if (column.hasAttribute('tdJump')) { + //@ts-ignore + td.style.color = '#208aed'; + //@ts-ignore + td.style.textDecoration = 'underline'; + //@ts-ignore + td.onclick = (event: any) => { + this.dispatchEvent( + new CustomEvent('td-click', { + detail: {//@ts-ignore + ...rowData.data,//@ts-ignore + }, + composed: true, + }) + ); + event.stopPropagation(); + }; + } + } + freshCurrentLine(element: HTMLElement, rowObject: TableRowObject, firstElement?: HTMLElement): void { if (!rowObject) { if (firstElement) { @@ -1605,6 +1630,13 @@ export class LitTable extends HTMLElement { this.setMouseIn(true, [this.currentTreeDivList[indexOf]]); } }; + this.querySelectorAll('lit-table-column').forEach((item, i) => { + if (this.hasAttribute('tree')) { + this.dispatchTdClickEvent(element.childNodes[i - 1], item, rowObject); + } else { + this.dispatchTdClickEvent(element.childNodes[i], item, rowObject); + } + }); // @ts-ignore (element as unknown).data = rowObject.data; //@ts-ignore if (rowObject.data.isSelected !== undefined) { diff --git a/ide/src/trace/bean/BoxSelection.ts b/ide/src/trace/bean/BoxSelection.ts index 817044b6a..128581840 100644 --- a/ide/src/trace/bean/BoxSelection.ts +++ b/ide/src/trace/bean/BoxSelection.ts @@ -1259,8 +1259,20 @@ export class BoxJumpParam { rightNs: number = 0; cpus: Array = []; state: string = ''; - processId: number = 0; - threadId: number = 0; + processId: number[] | undefined; + threadId: number[] | undefined; + isJumpPage: boolean | undefined; + currentId: string | undefined | null; +} + +export class SliceBoxJumpParam { + traceId: string | undefined | null; + leftNs: number = 0; + rightNs: number = 0; + processId: Array = []; + threadId: Array = []; + name: string[] | undefined | null; + isJumpPage: boolean | undefined } export class SelectionData { @@ -1293,6 +1305,8 @@ export class SelectionData { threadIds: Array = []; ts: number = 0; dur: number = 0; + tabTitle: string = ''; + allName: string[] | undefined } export class Counter { diff --git a/ide/src/trace/component/StackBar.ts b/ide/src/trace/component/StackBar.ts index c3cadc709..d7cbad633 100644 --- a/ide/src/trace/component/StackBar.ts +++ b/ide/src/trace/component/StackBar.ts @@ -28,16 +28,16 @@ export class StackBar extends BaseElement { set data(val: Array) { let map = new Map(); for (let v of val) { - if (map.has(v.state)) { - let sv = map.get(v.state); + if (map.has(v.stateJX)) { + let sv = map.get(v.stateJX); sv!.value = sv!.value + v.wallDuration; - sv!.state = `${v.state} : ${sv!.value.toFixed(5)}ms`; + sv!.state = `${v.stateJX} : ${sv!.value.toFixed(5)}ms`; } else { let sv = new StackValue(); sv.value = v.wallDuration; - sv.state = `${v.state} : ${sv.value.toFixed(5)}ms`; - sv.color = Utils.getStateColor(v.stateJX); - map.set(v.state, sv); + sv.state = `${v.stateJX} : ${sv.value.toFixed(5)}ms`; + sv.color = Utils.getStateColor(v.state); + map.set(v.stateJX, sv); } } let totalDuration = 0; diff --git a/ide/src/trace/component/trace/base/TraceSheet.ts b/ide/src/trace/component/trace/base/TraceSheet.ts index 11fa0102d..a269f24b8 100644 --- a/ide/src/trace/component/trace/base/TraceSheet.ts +++ b/ide/src/trace/component/trace/base/TraceSheet.ts @@ -16,7 +16,7 @@ import { BaseElement, element } from '../../../../base-ui/BaseElement'; import { type LitTabs } from '../../../../base-ui/tabs/lit-tabs'; import { LitTabpane } from '../../../../base-ui/tabs/lit-tabpane'; -import { BoxJumpParam, SelectionParam } from '../../../bean/BoxSelection'; +import { BoxJumpParam, SelectionParam, SliceBoxJumpParam } from '../../../bean/BoxSelection'; import { type TabPaneCurrentSelection } from '../sheet/TabPaneCurrentSelection'; import { type TabPaneFlag } from '../timer-shaft/TabPaneFlag'; import { type Flag } from '../timer-shaft/Flag'; @@ -92,6 +92,7 @@ import { SpSystemTrace } from '../../SpSystemTrace'; import { PerfToolStruct } from '../../../database/ui-worker/ProcedureWorkerPerfTool'; import { GpuCounterStruct } from '../../../database/ui-worker/ProcedureWorkerGpuCounter'; import { TabPaneGpuCounter } from '../sheet/gpu-counter/TabPaneGpuCounter'; +import { TabPaneSliceChild } from '../sheet/process/TabPaneSliceChild'; @element('trace-sheet') export class TraceSheet extends BaseElement { @@ -200,10 +201,9 @@ export class TraceSheet extends BaseElement { this.litTabs!.onTabClick = (e: unknown): void => this.loadTabPaneData(e.detail.key); this.tableCloseHandler(); this.rowClickEvent(); + this.tdClickEvent(); } private rowClickEvent(): void { - this.getComponentByID('box-spt')?.addEventListener('row-click', this.rowClickHandler.bind(this)); - this.getComponentByID('box-pts')?.addEventListener('row-click', this.rowClickHandler.bind(this)); this.getComponentByID('box-perf-analysis')?.addEventListener('row-click', (evt: MouseEvent) => { this.perfAnalysisListener(evt); }); @@ -251,6 +251,18 @@ export class TraceSheet extends BaseElement { }); } + private tdClickEvent(): void { + this.getComponentByID('box-spt')?.addEventListener('td-click', (evt: any) => { + this.tdClickHandler(evt)}); + this.getComponentByID('box-pts')?.addEventListener('td-click', (evt: any) => { + this.tdClickHandler(evt)}); + this.getComponentByID('box-thread-states')?.addEventListener('td-click', (evt: any) => { + this.tdClickHandler(evt); + }); + this.getComponentByID('box-slices')?.addEventListener('td-click', (evt: any) => { + this.tdSliceClickHandler(evt)}) + } + private perfAnalysisListener(evt: MouseEvent): void { // @ts-ignore if (evt.detail.button === 2 && evt.detail.pid) { @@ -1069,28 +1081,60 @@ export class TraceSheet extends BaseElement { window.publish(window.SmartEvent.UI.ShowBottomTab, { show: show, delta: delta }); } - rowClickHandler(e: unknown): void { + tdClickHandler(e: unknown): void { // @ts-ignore this.currentPaneID = e.target.parentElement.id; + //隐藏除了当前Tab页的其他Tab页 this.shadowRoot!.querySelectorAll('lit-tabpane').forEach((it): boolean => it.id !== this.currentPaneID ? (it.hidden = true) : (it.hidden = false) - ); - let pane = this.getPaneByID('box-cpu-child'); - pane.closeable = true; + );//todo:看能不能优化 + let pane = this.getPaneByID('box-cpu-child');//通过Id找到需要展示的Tab页 + pane.closeable = true;//关闭的ican显示 pane.hidden = false; - this.litTabs!.activeByKey(pane.key); // @ts-ignore - pane.tab = Utils.transferPTSTitle(e.detail.title); + this.litTabs!.activeByKey(pane.key); //显示key值对应的Tab页 + // @ts-ignore + pane.tab = e.detail.tabTitle ? e.detail.tabTitle : Utils.transferPTSTitle(e.detail.title);//设置Tab页标题,有的标题可直接用,有的标题需在此转换成需要展示的字符串 let param = new BoxJumpParam(); param.traceId = this.selection!.traceId; param.leftNs = this.selection!.leftNs; param.rightNs = this.selection!.rightNs; - param.cpus = this.selection!.cpus; // @ts-ignore - param.state = e.detail.state; // @ts-ignore - param.processId = e.detail.pid; // @ts-ignore - param.threadId = e.detail.tid; + param.cpus = this.selection!.cpus; + // @ts-ignore + param.state = e.detail.summary ? '' : e.detail.state; + // @ts-ignore + param.processId = e.detail.summary ? this.selection.processIds : e.detail.pid; + // @ts-ignore + param.threadId = e.detail.summary ? this.selection.threadIds : e.detail.tid; + param.isJumpPage = true;// @ts-ignore + param.currentId = e.target.parentElement.id;//根据父Tab页的标题,确认子Tab页的dur是否需要处理 (pane.children.item(0) as TabPaneBoxChild).data = param; } + //Slice Tab点击Occurrences列下的td进行跳转 + tdSliceClickHandler(e: unknown) { + // @ts-ignore + this.currentPaneID = e.target.parentElement.id; + //隐藏除了当前Tab页的其他Tab页 + this.shadowRoot!.querySelectorAll('lit-tabpane').forEach((it): boolean => + it.id !== this.currentPaneID ? (it.hidden = true) : (it.hidden = false) + ); + let pane = this.getPaneByID('box-slice-child');//通过Id找到需要展示的Tab页 + pane.closeable = true; + pane.hidden = false; + this.litTabs!.activeByKey(pane.key); //显示key值(sheetconfig里面对应的index是一个数字)对应的Tab页 + // @ts-ignore + pane.tab = e.detail.tabTitle;//设置Tab页标题 + let param = new SliceBoxJumpParam(); + param.traceId = this.selection!.traceId; + param.leftNs = this.selection!.leftNs; + param.rightNs = this.selection!.rightNs; + param.processId = this.selection!.processIds; + param.threadId = this.selection!.funTids;//@ts-ignore2 + param.name = e.detail.allName ? e.detail.allName : [e.detail.name]; + param.isJumpPage = true; + (pane.children.item(0) as TabPaneSliceChild).data = param; + } + clearMemory(): void { let allTabs = Array.from(this.shadowRoot?.querySelectorAll('#tabs lit-tabpane').values() || []); allTabs.forEach((tab) => { diff --git a/ide/src/trace/component/trace/base/TraceSheetConfig.ts b/ide/src/trace/component/trace/base/TraceSheetConfig.ts index 16bbc9f24..01ea33027 100644 --- a/ide/src/trace/component/trace/base/TraceSheetConfig.ts +++ b/ide/src/trace/component/trace/base/TraceSheetConfig.ts @@ -135,6 +135,7 @@ import { TabPaneMtParallel } from '../sheet/parallel/TabPaneMtParallel'; import { TabPanePerfAsync } from '../sheet/hiperf/TabPerfAsyncList'; import { TabPaneUserPlugin } from '../sheet/userPlugin/TabPaneUserPlugin'; import { TabPaneDmaFence } from '../sheet/dma-fence/TabPaneDmaFenceSelect'; +import { TabPaneSliceChild } from '../sheet/process/TabPaneSliceChild'; export let tabConfig: unknown = { 'current-selection': { @@ -726,4 +727,8 @@ export let tabConfig: unknown = { type: TabPaneDmaFence, require: (param: SelectionParam) => param.dmaFenceNameData.length > 0, }, + 'box-slice-child': { + title: '', + type: TabPaneSliceChild, + }, }; diff --git a/ide/src/trace/component/trace/sheet/TabPaneCurrentSelection.ts b/ide/src/trace/component/trace/sheet/TabPaneCurrentSelection.ts index a3cce1799..016fbe62b 100644 --- a/ide/src/trace/component/trace/sheet/TabPaneCurrentSelection.ts +++ b/ide/src/trace/component/trace/sheet/TabPaneCurrentSelection.ts @@ -50,7 +50,6 @@ import { queryBinderArgsByArgset, queryDistributedRelationAllData, queryRunnableTimeByRunning, - queryThreadNearData, queryThreadStateArgs, queryThreadWakeUp, queryThreadWakeUpFrom, @@ -63,6 +62,7 @@ import { queryRealTime } from '../../../database/sql/Clock.sql'; import { PerfToolStruct } from '../../../database/ui-worker/ProcedureWorkerPerfTool'; import { TraceMode } from '../../../SpApplicationPublicFunc'; import { threadPool, threadPool2 } from '../../../database/SqlLite'; +import { threadNearData } from '../../../database/data-trafic/SliceSender'; const INPUT_WORD = 'This is the interval from when the task became eligible to run \n(e.g.because of notifying a wait queue it was a suspended on) to\n when it started running.'; @@ -903,7 +903,7 @@ export class TabPaneCurrentSelection extends BaseElement { .sort((near1, near2) => near1.startTime - near2.startTime) .forEach((near) => { // @ts-ignore - if (near.itid === data.id) { + if (near.id === data.id) { // @ts-ignore if (near.startTime < data.startTime!) { preData = near; @@ -973,7 +973,7 @@ export class TabPaneCurrentSelection extends BaseElement { this.queryThreadWakeUpFromData(data.id!, data.startTime!, data.dur!), this.queryThreadWakeUpData(data.id!, data.startTime!, data.dur!), this.queryThreadStateDArgs(data.argSetID), - queryThreadNearData(data.id!, data.startTime!), + threadNearData('near-data', data.pid!, data.tid!, data.startTime!), ]).then((result) => { let fromBean = result[0]; let wakeUps = result[1]; @@ -981,7 +981,7 @@ export class TabPaneCurrentSelection extends BaseElement { let [preData, nextData] = this.sortByNearData(result[3], data, list); this.setWakeupData(fromBean, wakeUps, list); if (args.length > 0) { - args.forEach((arg) => { + args.forEach((arg: any) => { list.push({ name: arg.keyName, value: arg.strValue }); }); } @@ -1064,7 +1064,7 @@ export class TabPaneCurrentSelection extends BaseElement { // @ts-ignore cpu: nextData.cpu, // @ts-ignore - id: nextData.itid, + id: nextData.id, // @ts-ignore state: nextData.state, // @ts-ignore @@ -1087,7 +1087,7 @@ export class TabPaneCurrentSelection extends BaseElement { // @ts-ignore cpu: preData.cpu, // @ts-ignore - id: preData.itid, + id: preData.id, // @ts-ignore state: preData.state, // @ts-ignore diff --git a/ide/src/trace/component/trace/sheet/cpu/TabPaneBoxChild.ts b/ide/src/trace/component/trace/sheet/cpu/TabPaneBoxChild.ts index 33ccb43bb..16b3fe718 100644 --- a/ide/src/trace/component/trace/sheet/cpu/TabPaneBoxChild.ts +++ b/ide/src/trace/component/trace/sheet/cpu/TabPaneBoxChild.ts @@ -17,21 +17,23 @@ import { BaseElement, element } from '../../../../../base-ui/BaseElement'; import { LitTable } from '../../../../../base-ui/table/lit-table'; import { BoxJumpParam, SelectionData } from '../../../../bean/BoxSelection'; import { Utils } from '../../base/Utils'; -import { SPTChild } from '../../../../bean/StateProcessThread'; import { resizeObserver } from '../SheetUtils'; -import { getTabBoxChildData } from '../../../../database/sql/ProcessThread.sql'; +import { sliceChildBoxSender, threadNearData } from '../../../../database/data-trafic/SliceSender'; @element('tabpane-box-child') export class TabPaneBoxChild extends BaseElement { private boxChildTbl: LitTable | null | undefined; private boxChildRange: HTMLLabelElement | null | undefined; - private boxChildSource: Array = []; + private boxChildSource: Array = []; + private boxChildParam: BoxJumpParam | null | undefined; set data(boxChildValue: BoxJumpParam) { - if (this.boxChildTbl) { - // @ts-ignore - this.boxChildTbl.shadowRoot?.querySelector('.table').style.height = `${this.parentElement!.clientHeight - 45}px`; - } + //切换Tab页 保持childTab数据不变 除非重新点击跳转 + if (boxChildValue === this.boxChildParam || !boxChildValue.isJumpPage) { + return; + } // @ts-ignore + this.boxChildParam = boxChildValue; + //显示框选范围对应的时间 this.boxChildRange!.textContent = `Selected range: ${parseFloat( ((boxChildValue.rightNs - boxChildValue.leftNs) / 1000000.0).toFixed(5) )} ms`; @@ -46,6 +48,19 @@ export class TabPaneBoxChild extends BaseElement { // @ts-ignore this.sortByColumn(evt.detail); }); + //监听row的点击事件,在对应起始时间上画标记棋子 + this.boxChildTbl!.addEventListener('row-click', (evt): void => { + //@ts-ignore + let param = evt.detail.data; + param.isSelected = true; + this.boxChildTbl!.clearAllSelection(param); + this.boxChildTbl!.setCurrentSelection(param); + document.dispatchEvent( + new CustomEvent('triangle-flag', { + detail: { time: [param.startTime], type: 'triangle' }, + }) + ); + }); } connectedCallback(): void { @@ -55,19 +70,35 @@ export class TabPaneBoxChild extends BaseElement { getDataByDB(val: BoxJumpParam): void { this.boxChildTbl!.loading = true; - getTabBoxChildData(val.leftNs, val.rightNs, val.cpus, val.state, val.processId, - val.threadId, val.traceId).then((result): void => { + sliceChildBoxSender( 'state-box', val.leftNs, val.rightNs, val.threadId!, val.processId!, + val.cpus, val.state, val.traceId!).then((result: any): void => { this.boxChildTbl!.loading = false; if (result.length !== null && result.length > 0) { - result.map((e) => { - e.startTime = Utils.getTimeString(e.startNs); + result.map((e: any) => { + //获取优先级数据 + let prioObj = Utils.getInstance().getSchedSliceMap().get(`${e.id}-${e.startTime}`); + //thread statesTab页 dur截取的问题 与thread states保持一致 + if (val.currentId === 'box-thread-states') { + if (e.startTime < val.leftNs && (e.startTime + e.dur) < val.rightNs) { + e.dur = (e.startTime + e.dur) - val.leftNs; + } else if ((e.startTime + e.dur) > val.rightNs && e.startTime > val.leftNs) { + e.dur = val.rightNs - e.startTime; + } else if (e.startTime < val.leftNs && (e.startTime + e.dur) > val.rightNs) { + e.dur = val.rightNs - val.leftNs; + } + } + //相对起始时间转换为带单位的字符串 + e.sTime = Utils.getTimeString(e.startTime); // @ts-ignore - e.absoluteTime = ((window as unknown).recordStartNS + e.startNs) / 1000000000; + e.absoluteTime = ((window as unknown).recordStartNS + e.startTime) / 1000000000; e.state = Utils.getEndState(e.state)!; - e.prior = e.priority === undefined || e.priority === null ? '-' : `${e.priority}`; + e.duration = e.dur / 1000000; + e.prior = prioObj ? prioObj.priority : '-'; e.core = e.cpu === undefined || e.cpu === null ? '-' : `CPU${e.cpu}`; - e.processName = `${e.process === undefined || e.process === null ? 'process' : e.process}(${e.processId})`; - e.threadName = `${e.thread === undefined || e.thread === null ? 'thread' : e.thread}(${e.threadId})`; + let processInfo: string | undefined = Utils.getInstance().getProcessMap().get(e.pid); + e.processName = `${processInfo === undefined || processInfo === null ? 'process' : processInfo}(${e.pid})`; + let threadInfo: string | undefined = Utils.getInstance().getThreadMap().get(e.tid); + e.threadName = `${threadInfo === undefined || threadInfo === null ? 'thread' : threadInfo}(${e.tid})`; e.note = '-'; }); this.boxChildSource = result; @@ -102,22 +133,24 @@ export class TabPaneBoxChild extends BaseElement { - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + `; } diff --git a/ide/src/trace/component/trace/sheet/cpu/TabPanePTS.ts b/ide/src/trace/component/trace/sheet/cpu/TabPanePTS.ts index 59bb7ef9a..4f3745554 100644 --- a/ide/src/trace/component/trace/sheet/cpu/TabPanePTS.ts +++ b/ide/src/trace/component/trace/sheet/cpu/TabPanePTS.ts @@ -90,7 +90,7 @@ export class TabPanePTS extends BaseElement { - + diff --git a/ide/src/trace/component/trace/sheet/cpu/TabPaneSPT.ts b/ide/src/trace/component/trace/sheet/cpu/TabPaneSPT.ts index 29e7688d1..9d013f5f9 100644 --- a/ide/src/trace/component/trace/sheet/cpu/TabPaneSPT.ts +++ b/ide/src/trace/component/trace/sheet/cpu/TabPaneSPT.ts @@ -99,7 +99,7 @@ export class TabPaneSPT extends BaseElement { - + diff --git a/ide/src/trace/component/trace/sheet/process/TabPaneSliceChild.ts b/ide/src/trace/component/trace/sheet/process/TabPaneSliceChild.ts new file mode 100644 index 000000000..a32d06ba1 --- /dev/null +++ b/ide/src/trace/component/trace/sheet/process/TabPaneSliceChild.ts @@ -0,0 +1,166 @@ +/* + * Copyright (C) 2024 Huawei Device Co., Ltd. + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +import { BaseElement, element } from '../../../../../base-ui/BaseElement'; +import { LitTable } from '../../../../../base-ui/table/lit-table'; +import { SelectionData, SliceBoxJumpParam } from '../../../../bean/BoxSelection'; +import { Utils } from '../../base/Utils'; +import { resizeObserver } from '../SheetUtils'; +import { getTabDetails } from '../../../../database/sql/Func.sql'; + +@element('box-slice-child') +export class TabPaneSliceChild extends BaseElement { + private sliceChildTbl: LitTable | null | undefined; + private boxChildSource: Array = []; + private sliceChildParam: SliceBoxJumpParam | null | undefined; + + set data(boxChildValue: SliceBoxJumpParam) { + //切换Tab页 保持childTab数据不变 除非重新点击跳转 + if (boxChildValue === this.sliceChildParam || !boxChildValue.isJumpPage) { + return; + } + // @ts-ignore + this.sliceChildParam = boxChildValue; + this.sliceChildTbl!.recycleDataSource = []; + this.getDataByDB(boxChildValue); + } + + initElements(): void { + this.sliceChildTbl = this.shadowRoot?.querySelector('#tb-slice-child'); + this.sliceChildTbl!.addEventListener('column-click', (evt): void => { + // @ts-ignore + this.sortByColumn(evt.detail); + }); + //监听row的点击事件,在对应起始时间上画标记棋子 + this.sliceChildTbl!.addEventListener('row-click', (evt): void => { + //@ts-ignore + let param = evt.detail.data; + param.isSelected = true; + this.sliceChildTbl!.clearAllSelection(param); + this.sliceChildTbl!.setCurrentSelection(param); + document.dispatchEvent( + new CustomEvent('triangle-flag', { + detail: { time: [param.startNs], type: 'triangle' }, + }) + ); + }); + } + + connectedCallback(): void { + super.connectedCallback(); + resizeObserver(this.parentElement!, this.sliceChildTbl!, 25); + } + + getDataByDB(val: SliceBoxJumpParam): void { + this.sliceChildTbl!.loading = true; + //处理异步方法 + getTabDetails(val.name!, val.processId, val.leftNs, val.rightNs, 'async').then((res1: any) => {//@ts-ignore + //处理cat方法 + getTabDetails(val.name!, val.processId, val.leftNs, val.rightNs, 'cat').then((res2) => {//@ts-ignore + //处理同步方法 + getTabDetails(val.name!, val.processId, val.leftNs, val.rightNs, 'sync', val.threadId).then( + (res3: any) => { + let result: any = (res1 || []).concat(res2 || []).concat(res3 || []); + this.sliceChildTbl!.loading = false; + if (result.length !== null && result.length > 0) { + result.map((e: any) => { + e.startTime = Utils.getTimeString(e.startNs); + // @ts-ignore + e.absoluteTime = ((window as unknown).recordStartNS + e.startNs) / 1000000000; + e.duration = e.duration / 1000000; + e.state = Utils.getEndState(e.state)!; + e.processName = `${e.process === undefined || e.process === null ? 'process' : e.process}(${e.processId})`; + e.threadName = `${e.thread === undefined || e.thread === null ? 'thread' : e.thread}(${e.threadId})`; + }); + this.boxChildSource = result; + if (this.sliceChildTbl) { + // @ts-ignore + this.sliceChildTbl.recycleDataSource = result; + } + } else { + this.boxChildSource = []; + if (this.sliceChildTbl) { + // @ts-ignore + this.sliceChildTbl.recycleDataSource = []; + } + } + } + ); + }); + }); + } + + initHtml(): string { + return ` + + + + + + + + + + + + + + + + `; + } + + sortByColumn(detail: unknown): void { + // @ts-ignore + function compare(property, sort, type) { + return function (boxChildLeftData: SelectionData, boxChildRightData: SelectionData): number { + if (type === 'number') { + return sort === 2 // @ts-ignore + ? parseFloat(boxChildRightData[property]) - parseFloat(boxChildLeftData[property]) // @ts-ignore + : parseFloat(boxChildLeftData[property]) - parseFloat(boxChildRightData[property]); + } else { + // @ts-ignore + if (boxChildRightData[property] > boxChildLeftData[property]) { + return sort === 2 ? 1 : -1; + } else { + // @ts-ignore + if (boxChildRightData[property] === boxChildLeftData[property]) { + return 0; + } else { + return sort === 2 ? -1 : 1; + } + } + } + }; + } + //@ts-ignore + if (detail.key === 'startTime' || detail.key === 'processName'|| detail.key === 'threadName' ||//@ts-ignore + detail.key === 'name') { + // @ts-ignore + this.boxChildSource.sort(compare(detail.key, detail.sort, 'string'));// @ts-ignore + } else if (detail.key === 'absoluteTime' || detail.key === 'duration') {// @ts-ignore + this.boxChildSource.sort(compare(detail.key, detail.sort, 'number')); + } + // @ts-ignore + this.boxChildSource.sort(compare(detail.key, detail.sort, 'string')); + this.sliceChildTbl!.recycleDataSource = this.boxChildSource; + } +} diff --git a/ide/src/trace/component/trace/sheet/process/TabPaneSlices.ts b/ide/src/trace/component/trace/sheet/process/TabPaneSlices.ts index 4cbca41cf..4e10debb8 100644 --- a/ide/src/trace/component/trace/sheet/process/TabPaneSlices.ts +++ b/ide/src/trace/component/trace/sheet/process/TabPaneSlices.ts @@ -72,6 +72,8 @@ export class TabPaneSlices extends BaseElement { //@ts-ignore processSliceItem.name = processSliceItem.name === null ? '' : processSliceItem.name; //@ts-ignore + processSliceItem.tabTitle = processSliceItem.name; + //@ts-ignore sumWall += processSliceItem.wallDuration; //@ts-ignore sumOcc += processSliceItem.occurrences; @@ -84,6 +86,8 @@ export class TabPaneSlices extends BaseElement { count.process = ' '; count.wallDuration = parseFloat((sumWall / 1000000.0).toFixed(5)); count.occurrences = sumOcc; + count.tabTitle = 'Summary'; + count.allName = processSlicesResult.map((item: any) => item.name); processSlicesResult.splice(0, 0, count); //@ts-ignore this.slicesSource = processSlicesResult; this.slicesTbl!.recycleDataSource = processSlicesResult; @@ -273,7 +277,7 @@ export class TabPaneSlices extends BaseElement { key="avgDuration" align="flex-start" order > + key="occurrences" align="flex-start" order tdJump> `; diff --git a/ide/src/trace/component/trace/sheet/process/TabPaneThreadStates.ts b/ide/src/trace/component/trace/sheet/process/TabPaneThreadStates.ts index d9722e988..b79c54099 100644 --- a/ide/src/trace/component/trace/sheet/process/TabPaneThreadStates.ts +++ b/ide/src/trace/component/trace/sheet/process/TabPaneThreadStates.ts @@ -21,7 +21,7 @@ import { Utils } from '../../base/Utils'; import { StackBar } from '../../../StackBar'; import { log } from '../../../../../log/Log'; import { resizeObserver } from '../SheetUtils'; -import { getTabThreadStatesDetail } from '../../../../database/sql/ProcessThread.sql'; +import { sliceChildBoxSender } from '../../../../database/data-trafic/SliceSender'; @element('tabpane-thread-states') export class TabPaneThreadStates extends BaseElement { @@ -49,21 +49,17 @@ export class TabPaneThreadStates extends BaseElement { } async initThreadStates(threadStatesParam: SelectionParam | unknown): Promise { - // @ts-ignore - let leftStartNs = threadStatesParam.leftNs + threadStatesParam.recordStartNs; - // @ts-ignore - let rightEndNs = threadStatesParam.rightNs + threadStatesParam.recordStartNs; - - let threadStatesDetail = await getTabThreadStatesDetail( - // @ts-ignore - threadStatesParam.threadIds, + let threadStatesDetail = await sliceChildBoxSender( + 'state-box', // @ts-ignore threadStatesParam.leftNs, // @ts-ignore - threadStatesParam.rightNs + threadStatesParam.rightNs, + // @ts-ignore + threadStatesParam.threadIds ); - - let targetListTemp = this.updateThreadStates(threadStatesDetail, leftStartNs, rightEndNs); + // @ts-ignore + let targetListTemp = this.updateThreadStates(threadStatesDetail, threadStatesParam.leftNs, threadStatesParam.rightNs); let compare = (threadState1: SelectionData, threadState2: SelectionData): number => { let wallDuration1 = threadState1.wallDuration; @@ -83,49 +79,23 @@ export class TabPaneThreadStates extends BaseElement { updateThreadStates(threadStatDetail: Array, leftNs: number, rightNs: number): Array { let targetListTemp: unknown[] = []; if (threadStatDetail.length > 0) { - let durExceptionDataMap: Map = new Map(); let source: Map = new Map(); let target = threadStatDetail.reduce((map, current) => { // @ts-ignore let mapKey = `${current.pid}-${current.tid}`; // @ts-ignore let key = `${current.state}-${mapKey}`; - if (durExceptionDataMap.has(mapKey)) { - // 如果某线程中间有dur 为 -1的数据,则重新计算dur值,并给统计的值加上重新计算的dur - let pre = durExceptionDataMap.get(mapKey); - // @ts-ignore - pre.dur = current.ts - pre.ts; - // @ts-ignore - if (pre.ts < leftNs && pre.dur > 0) { - // @ts-ignore - pre.dur = pre.dur - (leftNs - pre.ts); - } - // @ts-ignore - if (pre.ts + pre.dur > rightNs && pre.dur > 0) { - // @ts-ignore - pre.dur = pre.dur - (pre.ts + pre.dur - rightNs); - } - // @ts-ignore - map.get(`${pre.state}-${mapKey}`).wallDuration += pre.dur; - durExceptionDataMap.delete(mapKey); - } // @ts-ignore - if (current.dur === null || current.dur === undefined || current.dur === -1) { - //如果出现dur 为-1的数据,dur先以0计算,在后续循环中碰到相同线程数据,则补上dur的值 + if (current.startTime < leftNs && (current.startTime + current.dur) < rightNs) { // @ts-ignore - current.dur = 0; - durExceptionDataMap.set(mapKey, current); - } else { + current.dur = current.dur - (leftNs - current.startTime);// @ts-ignore + } else if (current.startTime + current.dur > rightNs && current.startTime > leftNs) { // @ts-ignore - if (current.ts < leftNs && current.dur > 0) { - // @ts-ignore - current.dur = current.dur - (leftNs - current.ts); - } + current.dur = current.dur - (current.startTime + current.dur - rightNs); // @ts-ignore - if (current.ts + current.dur > rightNs && current.dur > 0) { - // @ts-ignore - current.dur = current.dur - (current.ts + current.dur - rightNs); - } + } else if (current.startTime < leftNs && (current.startTime + current.dur) > rightNs ) { + // @ts-ignore + current.dur = rightNs - leftNs; } // @ts-ignore if (map.has(key)) { @@ -150,50 +120,13 @@ export class TabPaneThreadStates extends BaseElement { } return map; }, source); - targetListTemp = this.updateThreadStatesExtend(durExceptionDataMap, target, leftNs, rightNs, targetListTemp); + //@ts-ignore + targetListTemp = Array.from(target.values()); } // @ts-ignore return targetListTemp; } - private updateThreadStatesExtend( - durExceptionDataMap: Map, - target: unknown, - leftNs: number, - rightNs: number, - targetListTemp: unknown[] - ): unknown[] { - // 通过上面循环之后,durExceptionDataMap 中的值即为 该线程 在框选时间内最后一条数据且dur 为-1,需要根据框选的时间把dur计算出来加上, - let arr = Array.from(durExceptionDataMap.values()); - for (let item of arr) { - // @ts-ignore - let key = `${item.state}-${item.pid}-${item.tid}`; - // @ts-ignore - if (target.has(key)) { - // @ts-ignore - target.get(key).wallDuration += rightNs - Math.max(item.ts, leftNs); - } else { - // @ts-ignore - target.set(key, { - // @ts-ignore - pid: item.pid, - // @ts-ignore - tid: item.tid, - // @ts-ignore - state: item.state, - // @ts-ignore - wallDuration: rightNs - Math.max(item.ts, leftNs), - avgDuration: 0, - occurrences: 1, - }); - } - } - durExceptionDataMap.clear(); - // @ts-ignore - targetListTemp = Array.from(target.values()); - return targetListTemp; - } - addSumLine(threadStatesParam: SelectionParam | unknown, targetListTemp: Array): void { log(targetListTemp); @@ -215,11 +148,10 @@ export class TabPaneThreadStates extends BaseElement { e.process = process || '[NULL]'; // @ts-ignore e.thread = thread || '[NULL]'; - // @ts-ignore - e.stateJX = e.state; + e.stateJX = Utils.getEndState(e.state); // @ts-ignore - e.state = Utils.getEndState(e.stateJX); + e.tabTitle = `${e.process}[${e.pid}]`; // @ts-ignore e.avgDuration = parseFloat((e.wallDuration / e.occurrences / 1000000.0).toFixed(5)); // @ts-ignore @@ -236,11 +168,15 @@ export class TabPaneThreadStates extends BaseElement { // @ts-ignore count.process = ' '; // @ts-ignore - count.state = ' '; + count.stateJX = ' '; // @ts-ignore count.wallDuration = parseFloat(sumWall.toFixed(5)); // @ts-ignore count.occurrences = sumOcc; + //@ts-ignore + count.summary = true; + // @ts-ignore + count.tabTitle = 'Summary'; targetList.splice(0, 0, count); } // @ts-ignore @@ -304,7 +240,7 @@ export class TabPaneThreadStates extends BaseElement { data-index="tid" key="tid" align="flex-start" order > + data-index="stateJX" key="stateJX" align="flex-start" order > @@ -313,7 +249,7 @@ export class TabPaneThreadStates extends BaseElement { data-index="avgDuration" key="avgDuration" align="flex-start" order > + data-index="occurrences" key="occurrences" align="flex-start" order tdJump> `; @@ -347,7 +283,7 @@ export class TabPaneThreadStates extends BaseElement { } // @ts-ignore - if (treadStatesDetail.key === 'name' || treadStatesDetail.key === 'thread' || treadStatesDetail.key === 'state') { + if (treadStatesDetail.key === 'name' || treadStatesDetail.key === 'thread' || treadStatesDetail.key === 'stateJX') { // @ts-ignore this.threadStatesTblSource.sort(compare(treadStatesDetail.key, treadStatesDetail.sort, 'string')); } else { diff --git a/ide/src/trace/database/data-trafic/SliceReceiver.ts b/ide/src/trace/database/data-trafic/SliceReceiver.ts index 6f7af969d..4ee7dfebf 100644 --- a/ide/src/trace/database/data-trafic/SliceReceiver.ts +++ b/ide/src/trace/database/data-trafic/SliceReceiver.ts @@ -13,7 +13,25 @@ import { Args } from './CommonArgs'; import { cpuList, processList, sliceList, threadStateList } from './utils/AllMemoryCache'; - +const dataCache: { + argSetID: number | null | undefined; + cpu: number | null | undefined; + dur: number | null | undefined; + itid: number | null | undefined; + pid: number | null | undefined; + state: string | null | undefined; + tid: number | null | undefined; + startTime: number | null | undefined; +} = { + argSetID: null, + cpu: null, + dur: null, + itid: null, + pid: null, + state: null, + tid: null, + startTime: null +}; export const sliceSqlMem = (args: Args): string => { return ` SELECT B.pid, @@ -110,14 +128,32 @@ export function sliceReceiver(data: unknown, proc: Function): void { } for (let key of cpuList.keys()) { let arr = cpuList.get(key) || []; - let last = arr[arr.length - 1]; //@ts-ignore - if (last && (last.dur === -1 || last.dur === null || last.dur === undefined)) { - //@ts-ignore - let totalNs = data.params.recordEndNS - data.params.recordStartNS; //@ts-ignore - last.dur = totalNs - last.startTime; - } count.cpu.set(key, arr.length); } + //处理threadList最后一个符合条件的dur + for (let key of threadStateList.keys()) { + let arr = threadStateList.get(key) || []; + let last = arr[arr.length - 1]; + if (!last) { + continue; + } + //@ts-ignore + switch (last.state) { + case 'S': + case 'I': + case 'T': + case 'X': + break; + default: + //@ts-ignore + if (last.dur === -1 || last.dur === null || last.dur === undefined) { + //@ts-ignore + let totalNs = data.params.recordEndNS - data.params.recordStartNS; //@ts-ignore + last.dur = totalNs - last.startTime; + } + break; + } + } //处理热点数据 //@ts-ignore let cpuUtiliRateArray = getCpuUtiliRate(cpuList, data.params); @@ -201,6 +237,12 @@ export function sliceSPTReceiver(data: unknown) { case 'spt-getCpuPriorityByTime': sptGetCpuPriorityByTime(data); break; + case 'state-box': + getChildBoxDb(data); + break; + case 'near-data': + seacrhThreadNearData(data); + break; } } } @@ -334,6 +376,82 @@ function sptGetCpuPriorityByTime(data: unknown): void { postMsg(data, result); } +//处理跳转子页面的数据 +function getChildBoxDb(data: unknown) { + let threadSlice = sliceList.get(0) || []; + let setProcessId; + let setThreadId; + let setCpu = new Set(); + //处理processId数据 + //@ts-ignore + setProcessId = handleIdParams(data.params.processId); + //处理threadId数据 + //@ts-ignore + setThreadId = handleIdParams(data.params.threadId); + //处理Cpu数据 + //@ts-ignore + if (data.params.cpus) {//@ts-ignore + if (data.params.cpus.length > 0) { + //@ts-ignore + setCpu = new Set(data.params.cpus); + } + } + + let childBoxDb = threadSlice.filter((it: any) => { + let condition = true; + // 检查进程ID + if (setProcessId.size !== 0) { + condition = condition && setProcessId.has(it.pid); + } + // 检查线程ID + if (setThreadId.size !== 0) { + condition = condition && setThreadId.has(it.tid); + } + // 检查CPU(如果存在且不是null/undefined,或在setCpu中) + if (setCpu.size !== 0) { + condition = condition && (it.cpu === null || it.cpu === undefined || setCpu.has(it.cpu)); + } + // 检查状态 + //@ts-ignore + if (data.params.state) { + //@ts-ignore + condition = condition && it.state === data.params.state; + } + //@ts-ignore + return condition && Math.max(data.params.leftNs, it.startTime!) < Math.min(data.params.rightNs, it.startTime! + it.dur!) + }) + postMsg(data, childBoxDb); +} +//处理processId和threadId +function handleIdParams(id: number | number[] | undefined) { + let setId; + if (Array.isArray(id) || typeof id === "number") { + setId = new Set(Array.isArray(id) ? id : [id]); + } else { + setId = new Set(); + } + return setId; +} + +//查找点击的thread块前后相邻块信息 +function seacrhThreadNearData(target: unknown) { + //@ts-ignore + let key = `${target.params.pid}-${target.params.tid}` + let preData; + let nextData; + let threadSlice = threadStateList.get(key) || []; + //@ts-ignore + let dbIndex = threadSlice.findIndex(it => it.startTime === target.params.startTime); + if (dbIndex !== -1) { + preData = threadSlice[dbIndex - 1] ? threadSlice[dbIndex - 1] : dataCache; + nextData = threadSlice[dbIndex + 1] ? threadSlice[dbIndex + 1] : dataCache; + } else { + preData = dataCache; + nextData = dataCache; + } + postMsg(target, [preData, nextData]); +} + function setStateData(slice: unknown, title: string): unknown { return { title: title, diff --git a/ide/src/trace/database/data-trafic/SliceSender.ts b/ide/src/trace/database/data-trafic/SliceSender.ts index f22957b62..42de9bf1a 100644 --- a/ide/src/trace/database/data-trafic/SliceSender.ts +++ b/ide/src/trace/database/data-trafic/SliceSender.ts @@ -54,3 +54,45 @@ export function sliceSPTSender(leftNs: number, rightNs: number, cpus: Array, state?: string, traceId?: string): Promise { + return new Promise((resolve): void => { + getThreadPool(traceId).submitProto( + QueryEnum.SliceChildBoxData, + { + leftNs: leftNs, + rightNs: rightNs, + cpus: cpus ? cpus : [], + processId: processId ? processId : [], + threadId: threadId ? threadId : [], + state: state ? state : '', + func: func ? func : '', + trafic: TraficEnum.Memory, + }, + (res: unknown, len: number, transfer: boolean): void => { + //@ts-ignore + resolve(res); + } + ); + }); +} + +export function threadNearData(func: string, pid: number, tid: number, startTime: number,traceId?: string): Promise { + return new Promise((resolve): void => { + getThreadPool(traceId).submitProto( + QueryEnum.ThreadNearData, + { + pid: pid, + tid: tid, + startTime: startTime, + func: func, + trafic: TraficEnum.Memory, + }, + (res: unknown, len: number, transfer: boolean): void => { + //@ts-ignore + resolve(res); + } + ); + }); +} diff --git a/ide/src/trace/database/data-trafic/utils/ExecProtoForWorker.ts b/ide/src/trace/database/data-trafic/utils/ExecProtoForWorker.ts index c5955daa4..ddb52bed5 100644 --- a/ide/src/trace/database/data-trafic/utils/ExecProtoForWorker.ts +++ b/ide/src/trace/database/data-trafic/utils/ExecProtoForWorker.ts @@ -155,4 +155,6 @@ traficHandlers.set(QueryEnum.EnergySystemData, energySysEventReceiver); traficHandlers.set(QueryEnum.LostFrameData, lostFrameReceiver); traficHandlers.set(QueryEnum.SliceData, sliceReceiver); traficHandlers.set(QueryEnum.SliceSPTData, sliceSPTReceiver); -traficHandlers.set(QueryEnum.dmaFenceData, dmaFenceReceiver); \ No newline at end of file +traficHandlers.set(QueryEnum.dmaFenceData, dmaFenceReceiver); +traficHandlers.set(QueryEnum.SliceChildBoxData, sliceSPTReceiver); +traficHandlers.set(QueryEnum.ThreadNearData, sliceSPTReceiver); \ No newline at end of file diff --git a/ide/src/trace/database/data-trafic/utils/QueryEnum.ts b/ide/src/trace/database/data-trafic/utils/QueryEnum.ts index d9368c34d..e51ccb00a 100644 --- a/ide/src/trace/database/data-trafic/utils/QueryEnum.ts +++ b/ide/src/trace/database/data-trafic/utils/QueryEnum.ts @@ -88,6 +88,8 @@ export enum QueryEnum { dmaFenceData = 166, SliceData = 300, SliceSPTData = 301, + SliceChildBoxData = 302, + ThreadNearData = 303, } export const MAX_COUNT = 2000; export enum TraficEnum { diff --git a/ide/src/trace/database/sql/Func.sql.ts b/ide/src/trace/database/sql/Func.sql.ts index 89902aeeb..aa84efeb4 100644 --- a/ide/src/trace/database/sql/Func.sql.ts +++ b/ide/src/trace/database/sql/Func.sql.ts @@ -338,6 +338,62 @@ export const getTabSlicesAsyncFunc = ( { $leftNS: leftNS, $rightNS: rightNS } ); +export const getTabDetails = ( + asyncNames: Array, + asyncPid: Array, + leftNS: number, + rightNS: number, + key: string, + funTids?: Array +): //@ts-ignore + Promise> => { + let asyncCondition = ''; + let catCondition = ''; + let syncCondition = ''; + if (key === 'async') { + asyncCondition = ` + and c.cookie not null + ` + } else if (key === 'cat') { + catCondition = ` + and c.cookie not null + and c.cat not null + ` + } else if (key === 'sync') { + syncCondition = ` + and A.tid in (${funTids!.join(',')}) + and c.cookie is null + ` + } + let condition = ` + ${asyncCondition} + ${catCondition} + ${syncCondition} + ${`and P.pid in (${asyncPid.join(',')})`} + ${`and c.name in (${asyncNames.map((it) => "'" + it + "'").join(',')})`} + ` + let sql = ` + SELECT + c.name AS name, + c.dur AS duration, + P.pid AS processId, + P.name AS process, + A.tid AS threadId, + A.name AS thread, + c.ts - D.start_ts as startNs + FROM + thread A,trace_range D + LEFT JOIN process P ON P.id = A.ipid + LEFT JOIN callstack C ON A.id = C.callid + where + C.ts > 0 + and + c.dur >= -1 + and + not ((C.ts - D.start_ts + C.dur < ${leftNS}) or (C.ts - D.start_ts > ${rightNS})) ${condition} + ` + return query('getTabDetails', sql, {}); + } export const getTabSlicesAsyncCatFunc = ( asyncCatNames: Array, asyncCatPid: Array, diff --git a/ide/src/trace/database/sql/ProcessThread.sql.ts b/ide/src/trace/database/sql/ProcessThread.sql.ts index 0e0ea84ad..ed5426bbc 100644 --- a/ide/src/trace/database/sql/ProcessThread.sql.ts +++ b/ide/src/trace/database/sql/ProcessThread.sql.ts @@ -328,27 +328,6 @@ from thread_state AS B where B.tid = $tid and B.pid = $pid;`, { $tid: tid, $pid: pid } ); -export const queryThreadNearData = ( - itid: number, - startTime: number -): //@ts-ignore -Promise> => - query( - 'queryThreadNearData', - ` -select itid,tid,pid,cpu,state,arg_setid as argSetID,dur,max((A.ts - B.start_ts)) as startTime -from thread_state A,trace_range B -where itid = ${itid} -and (A.ts - B.start_ts) < ${startTime} and A.ts > B.start_ts -union -select itid,tid,pid,cpu,state,arg_setid as argSetID,dur,min((A.ts - B.start_ts)) as startTime -from thread_state A,trace_range B -where itid = ${itid} -and (A.ts - B.start_ts) > ${startTime} and A.ts < B.end_ts; - `, - {}, - { traceId : Utils.currentSelectTrace } - ); export const queryThreadWakeUpFrom = (itid: number, startTime: number): Promise> => { let sql = ` @@ -392,58 +371,6 @@ export const queryProcessByTable = (traceId?: string): Promise< { traceId: traceId } ); -export const getTabBoxChildData = ( - leftNs: number, - rightNs: number, - cpus: number[], - state: string | undefined, - processId: number | undefined, - threadId: number | undefined, - traceId?: string | undefined | null -): Promise> => { - let condition = ` - ${state !== undefined && state !== '' ? `and B.state = '${state}'` : ''} - ${processId !== undefined && processId !== -1 ? `and IP.pid = ${processId}` : ''} - ${threadId !== undefined && threadId !== -1 ? `and A.tid = ${threadId}` : ''} - ${cpus.length > 0 ? `and (B.cpu is null or B.cpu in (${cpus.join(',')}))` : ''} - `; - let sql = `select - IP.name as process, - IP.pid as processId, - A.name as thread, - B.state as state, - A.tid as threadId, - B.dur as duration, - B.ts - TR.start_ts as startNs, - B.cpu, - C.priority - from - thread_state AS B - left join - thread as A - on - B.itid = A.itid - left join - process AS IP - on - A.ipid = IP.ipid - left join - trace_range AS TR - left join - sched_slice as C - on - B.itid = C.itid - and - C.ts = B.ts - where - B.dur > 0 - and - IP.pid not null - and - not ((B.ts - TR.start_ts + B.dur < ${leftNs}) or (B.ts - TR.start_ts > ${rightNs})) ${condition}; - `; - return query('getTabBoxChildData', sql, {}, { traceId: traceId }); -}; export const getTabStartups = ( ids: Array, leftNS: number, @@ -1283,34 +1210,6 @@ Promise> => { $leftNS: leftNS, $rightNS: rightNS } ); -// 查询线程状态详细信息 -export const getTabThreadStatesDetail = ( - tIds: Array, - leftNS: number, - rightNS: number -): //@ts-ignore -Promise> => - query( - 'getTabThreadStates', - `select - B.pid, - B.tid, - B.state, - B.ts, - B.dur - from - thread_state AS B - left join - trace_range AS TR - where - B.tid in (${tIds.join(',')}) - and - not ((B.ts - TR.start_ts + ifnull(B.dur,0) < $leftNS) or (B.ts - TR.start_ts > $rightNS)) - order by ts;`, - { $leftNS: leftNS, $rightNS: rightNS }, - { traceId: Utils.currentSelectTrace} - ); - export const queryAnomalyDetailedData = (leftNs: number, rightNs: number): Promise> => query( 'queryAnomalyDetailedData', -- Gitee