From 60653704b68a35f86d8e1862bdf035e79269a285 Mon Sep 17 00:00:00 2001 From: zhangzepeng Date: Sat, 13 Jan 2024 15:32:14 +0800 Subject: [PATCH] =?UTF-8?q?=E2=80=98=E4=BB=A3=E7=A0=81=E6=95=B4=E6=94=B9?= =?UTF-8?q?=E2=80=99?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: zhangzepeng --- ide/src/base-ui/drawer/LitDrawer.ts | 400 ++-- ide/src/base-ui/modal/LitModal.ts | 275 ++- ide/src/base-ui/popover/LitPopoverV.ts | 698 +++--- ide/src/base-ui/select/LitAllocationSelect.ts | 177 +- ide/src/base-ui/select/LitSelectHtml.ts | 393 +-- ide/src/base-ui/slider/LitSlider.ts | 211 +- ide/src/base-ui/tree/LitTree.ts | 18 +- ide/src/trace/bean/BoxSelection.ts | 876 ++++++- ide/src/trace/component/SpHelp.ts | 838 +++---- ide/src/trace/component/SpInfoAndStas.html.ts | 133 + ide/src/trace/component/SpInfoAndStas.ts | 123 +- ide/src/trace/component/SpKeyboard.html.ts | 201 ++ ide/src/trace/component/SpKeyboard.ts | 199 +- ide/src/trace/component/SpMetrics.html.ts | 145 ++ ide/src/trace/component/SpMetrics.ts | 134 +- ide/src/trace/component/SpQuerySQL.html.ts | 197 ++ ide/src/trace/component/SpQuerySQL.ts | 184 +- .../trace/component/SpSystemTrace.event.ts | 724 ++---- ide/src/trace/component/SpSystemTrace.init.ts | 2133 ++++++----------- ide/src/trace/component/SpSystemTrace.line.ts | 779 +++--- ide/src/trace/component/SpSystemTrace.ts | 190 +- .../component/chart/SpAbilityMonitorChart.ts | 130 +- .../setting/bean/ProfilerServiceTypes.ts | 583 +---- ide/src/trace/component/trace/SpChartList.ts | 73 +- .../component/trace/TimerShaftElement.html.ts | 116 + .../component/trace/TimerShaftElement.ts | 119 +- .../component/trace/base/TraceRowConfig.ts | 29 +- .../sheet/TabPaneCurrentSelection.html.ts | 112 + .../trace/sheet/TabPaneCurrentSelection.ts | 1299 +++++----- .../trace/sheet/TabPaneFilter.html.ts | 328 +++ .../component/trace/sheet/TabPaneFilter.ts | 657 ++--- .../sheet/TabPaneJsMemoryFilter.html.ts} | 109 +- .../trace/sheet/TabPaneJsMemoryFilter.ts | 64 +- .../TabPaneFilesystemStatisticsAnalysis.ts | 414 ++-- .../TabPaneIOTierStatisticsAnalysis.ts | 250 +- .../TabPaneVirtualMemoryStatisticsAnalysis.ts | 262 +- .../trace/sheet/hiperf/TabPanePerfAnalysis.ts | 59 +- .../trace/sheet/jank/TabPaneFrames.ts | 46 +- .../native-memory/TabPaneNMSampleList.ts | 34 +- .../trace/sheet/process/TabPaneStartup.ts | 108 +- .../vmtracker/TabPaneVmTrackerShm.html.ts} | 90 +- .../sheet/vmtracker/TabPaneVmTrackerShm.ts | 51 +- .../TabPaneVmTrackerShmComparison.html.ts} | 88 +- .../TabPaneVmTrackerShmComparison.ts | 61 +- .../component/trace/timer-shaft/RangeRuler.ts | 550 +---- ide/src/trace/database/ConvertTraceWorker.ts | 226 +- ide/src/trace/database/SqlLite.ts | 116 +- .../data-trafic/FrameJanksReceiver.ts | 13 +- .../ProcedureLogicWorkerFileSystem.ts | 21 +- .../logic-worker/ProcedureLogicWorkerPerf.ts | 2 +- .../database/ui-worker/ProcedureWorker.ts | 37 +- .../ui-worker/ProcedureWorkerAppStartup.ts | 14 +- .../ui-worker/ProcedureWorkerClock.ts | 13 + .../ui-worker/ProcedureWorkerCommon.ts | 118 +- .../ui-worker/ProcedureWorkerCpuProfiler.ts | 80 +- .../ui-worker/ProcedureWorkerDiskIoAbility.ts | 18 +- .../ui-worker/ProcedureWorkerEnergyPower.ts | 48 +- .../ui-worker/ProcedureWorkerEnergyState.ts | 18 +- .../ProcedureWorkerFrameAnimation.ts | 14 +- .../ui-worker/ProcedureWorkerFrameDynamic.ts | 14 +- .../ui-worker/ProcedureWorkerFrameSpacing.ts | 14 +- .../database/ui-worker/ProcedureWorkerFreq.ts | 14 +- .../database/ui-worker/ProcedureWorkerFunc.ts | 29 +- .../database/ui-worker/ProcedureWorkerHeap.ts | 106 +- .../ui-worker/ProcedureWorkerHeapSnapshot.ts | 20 + .../database/ui-worker/ProcedureWorkerIrq.ts | 13 + .../database/ui-worker/ProcedureWorkerJank.ts | 48 +- .../ui-worker/ProcedureWorkerMemoryAbility.ts | 18 +- .../ui-worker/ProcedureWorkerProcess.ts | 9 +- .../ui-worker/ProcedureWorkerSnapshot.ts | 108 + .../ui-worker/ProcedureWorkerSoInit.ts | 14 +- .../ui-worker/ProcedureWorkerThread.ts | 16 +- .../ui-worker/ProduceWorkerSdkCounter.ts | 18 +- .../ui-worker/ProduceWorkerSdkSlice.ts | 29 +- .../ui-worker/cpu/ProcedureWorkerCPU.ts | 20 + .../cpu/ProcedureWorkerCpuFreqLimits.ts | 14 +- .../ui-worker/cpu/ProcedureWorkerCpuState.ts | 14 +- .../hiperf/ProcedureWorkerHiPerfReport.ts | 61 +- .../AbilityMonitorReceiver.test.ts | 105 - .../data-trafic/AbilityMonitorSender.test.ts | 191 -- .../data-trafic/ArkTsReceiver.test.ts | 53 - .../database/data-trafic/ArkTsSender.test.ts | 43 - .../data-trafic/ClockDataReceiver.test.ts | 87 - .../data-trafic/CpuDataReceiver.test.ts | 97 - .../data-trafic/CpuFreqDataReceiver.test.ts | 62 - .../data-trafic/CpuFreqDataSender.test.ts | 47 - .../CpuFreqLimitDataReceiver.test.ts | 62 - .../CpuFreqLimitDataSender.test.ts | 50 - .../data-trafic/CpuStateReceiver.test.ts | 67 - .../data-trafic/CpuStateSender.test.ts | 47 - .../database/data-trafic/DataFilter.test.ts | 90 - .../database/data-trafic/EBPFReceiver.test.ts | 81 - .../database/data-trafic/EBPFSender.test.ts | 77 - .../EnergySysEventReceiver.test.ts | 226 -- .../data-trafic/EnergySysEventSender.test.ts | 119 - .../FrameDynamicEffectReceiver.test.ts | 104 - .../FrameDynamicEffectSender.test.ts | 121 - .../data-trafic/FrameJanksReceiver.test.ts | 94 - .../data-trafic/FrameJanksSender.test.ts | 90 - .../data-trafic/FuncDataReceiver.test.ts | 83 - .../data-trafic/FuncDataSender.test.ts | 51 - .../data-trafic/HiSysEventDataReciver.test.ts | 55 - .../data-trafic/HiSysEventDataSender.test.ts | 57 - .../HiperfCallChartReceiver.test.ts | 73 - .../data-trafic/HiperfCpuDataReceiver.test.ts | 65 - .../data-trafic/HiperfCpuDataSender.test.ts | 54 - .../HiperfProcessDataReceiver.test.ts | 87 - .../HiperfProcessDataSender.test.ts | 54 - .../HiperfThreadDataReceiver.test.ts | 87 - .../HiperfThreadDataSender.test.ts | 54 - .../data-trafic/IrqDataReceiver.test.ts | 104 - .../data-trafic/IrqDataSender.test.ts | 52 - .../data-trafic/LogDataReceiver.test.ts | 55 - .../data-trafic/LogDataSender.test.ts | 54 - .../NativeMemoryDataReceiver.test.ts | 74 - .../NativeMemoryDataSender.test.ts | 68 - .../ProcessActualDataReceiver.test.ts | 57 - .../ProcessActualDataSender.test.ts | 66 - .../data-trafic/ProcessDataReceiver.test.ts | 59 - .../data-trafic/ProcessDataSender.test.ts | 46 - ...ocessDeliverInputEventDataReceiver.test.ts | 63 - ...ProcessDeliverInputEventDataSender.test.ts | 53 - .../ProcessExpectedDataReceiver.test.ts | 56 - .../ProcessExpectedDataSender.test.ts | 47 - .../ProcessMemDataReceiver.test.ts | 54 - .../data-trafic/ProcessMemDataSender.test.ts | 45 - .../ProcessSoInitDataReceiver.test.ts | 46 - .../ProcessSoInitDataSender.test.ts | 35 - .../ProcessStartupDataReceiver.test.ts | 56 - .../ProcessStartupDataSender.test.ts | 45 - .../data-trafic/ThreadDataSender.test.ts | 47 - .../VirtualMemoryDataReceiver.test.ts | 58 - .../VirtualMemoryDataSender.test.ts | 45 - .../data-trafic/VmTrackerDataReceiver.test.ts | 136 -- .../data-trafic/VmTrackerDataSender.test.ts | 179 -- trace_streamer/src/base/index_map.h | 40 +- .../src/filter/hi_sysevent_measure_filter.cpp | 6 +- .../src/filter/hi_sysevent_measure_filter.h | 1 + trace_streamer/src/main.cpp | 55 +- .../parser/bytrace_parser/bytrace_parser.cpp | 143 +- .../parser/bytrace_parser/bytrace_parser.h | 6 + .../htrace_mem_parser.cpp | 13 - .../htrace_pbreader_parser/htrace_parser.cpp | 136 +- .../htrace_pbreader_parser/htrace_parser.h | 9 +- .../rawtrace_parser/cpu_detail_parser.cpp | 149 +- .../rawtrace_parser/cpu_detail_parser.h | 8 + .../ftrace_event_processor.cpp | 213 +- .../rawtrace_parser/ftrace_event_processor.h | 8 + trace_streamer/src/rpc/ffrt_converter.cpp | 400 ++-- trace_streamer/src/rpc/ffrt_converter.h | 24 +- trace_streamer/src/rpc/rpc_server.cpp | 183 +- trace_streamer/src/rpc/rpc_server.h | 16 +- .../trace_data/sqllite_prepar_cache_data.cpp | 361 +-- .../trace_data/sqllite_prepar_cache_data.h | 5 + .../src/trace_data/trace_data_cache.cpp | 77 +- .../src/trace_data/trace_data_cache.h | 4 + .../native_memory/native_hook_parser_test.cpp | 72 +- 157 files changed, 8993 insertions(+), 13146 deletions(-) create mode 100644 ide/src/trace/component/SpInfoAndStas.html.ts create mode 100644 ide/src/trace/component/SpKeyboard.html.ts create mode 100644 ide/src/trace/component/SpMetrics.html.ts create mode 100644 ide/src/trace/component/SpQuerySQL.html.ts create mode 100644 ide/src/trace/component/trace/TimerShaftElement.html.ts create mode 100644 ide/src/trace/component/trace/sheet/TabPaneCurrentSelection.html.ts create mode 100644 ide/src/trace/component/trace/sheet/TabPaneFilter.html.ts rename ide/{test/trace/database/data-trafic/ThreadDataReceiver.test.ts => src/trace/component/trace/sheet/TabPaneJsMemoryFilter.html.ts} (31%) rename ide/{test/trace/database/data-trafic/CpuDataSender.test.ts => src/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShm.html.ts} (30%) rename ide/{test/trace/database/data-trafic/ClockDataSender.test.ts => src/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShmComparison.html.ts} (31%) delete mode 100644 ide/test/trace/database/data-trafic/AbilityMonitorReceiver.test.ts delete mode 100644 ide/test/trace/database/data-trafic/AbilityMonitorSender.test.ts delete mode 100644 ide/test/trace/database/data-trafic/ArkTsReceiver.test.ts delete mode 100644 ide/test/trace/database/data-trafic/ArkTsSender.test.ts delete mode 100644 ide/test/trace/database/data-trafic/ClockDataReceiver.test.ts delete mode 100644 ide/test/trace/database/data-trafic/CpuDataReceiver.test.ts delete mode 100644 ide/test/trace/database/data-trafic/CpuFreqDataReceiver.test.ts delete mode 100644 ide/test/trace/database/data-trafic/CpuFreqDataSender.test.ts delete mode 100644 ide/test/trace/database/data-trafic/CpuFreqLimitDataReceiver.test.ts delete mode 100644 ide/test/trace/database/data-trafic/CpuFreqLimitDataSender.test.ts delete mode 100644 ide/test/trace/database/data-trafic/CpuStateReceiver.test.ts delete mode 100644 ide/test/trace/database/data-trafic/CpuStateSender.test.ts delete mode 100644 ide/test/trace/database/data-trafic/DataFilter.test.ts delete mode 100644 ide/test/trace/database/data-trafic/EBPFReceiver.test.ts delete mode 100644 ide/test/trace/database/data-trafic/EBPFSender.test.ts delete mode 100644 ide/test/trace/database/data-trafic/EnergySysEventReceiver.test.ts delete mode 100644 ide/test/trace/database/data-trafic/EnergySysEventSender.test.ts delete mode 100644 ide/test/trace/database/data-trafic/FrameDynamicEffectReceiver.test.ts delete mode 100644 ide/test/trace/database/data-trafic/FrameDynamicEffectSender.test.ts delete mode 100644 ide/test/trace/database/data-trafic/FrameJanksReceiver.test.ts delete mode 100644 ide/test/trace/database/data-trafic/FrameJanksSender.test.ts delete mode 100644 ide/test/trace/database/data-trafic/FuncDataReceiver.test.ts delete mode 100644 ide/test/trace/database/data-trafic/FuncDataSender.test.ts delete mode 100644 ide/test/trace/database/data-trafic/HiSysEventDataReciver.test.ts delete mode 100644 ide/test/trace/database/data-trafic/HiSysEventDataSender.test.ts delete mode 100644 ide/test/trace/database/data-trafic/HiperfCallChartReceiver.test.ts delete mode 100644 ide/test/trace/database/data-trafic/HiperfCpuDataReceiver.test.ts delete mode 100644 ide/test/trace/database/data-trafic/HiperfCpuDataSender.test.ts delete mode 100644 ide/test/trace/database/data-trafic/HiperfProcessDataReceiver.test.ts delete mode 100644 ide/test/trace/database/data-trafic/HiperfProcessDataSender.test.ts delete mode 100644 ide/test/trace/database/data-trafic/HiperfThreadDataReceiver.test.ts delete mode 100644 ide/test/trace/database/data-trafic/HiperfThreadDataSender.test.ts delete mode 100644 ide/test/trace/database/data-trafic/IrqDataReceiver.test.ts delete mode 100644 ide/test/trace/database/data-trafic/IrqDataSender.test.ts delete mode 100644 ide/test/trace/database/data-trafic/LogDataReceiver.test.ts delete mode 100644 ide/test/trace/database/data-trafic/LogDataSender.test.ts delete mode 100644 ide/test/trace/database/data-trafic/NativeMemoryDataReceiver.test.ts delete mode 100644 ide/test/trace/database/data-trafic/NativeMemoryDataSender.test.ts delete mode 100644 ide/test/trace/database/data-trafic/ProcessActualDataReceiver.test.ts delete mode 100644 ide/test/trace/database/data-trafic/ProcessActualDataSender.test.ts delete mode 100644 ide/test/trace/database/data-trafic/ProcessDataReceiver.test.ts delete mode 100644 ide/test/trace/database/data-trafic/ProcessDataSender.test.ts delete mode 100644 ide/test/trace/database/data-trafic/ProcessDeliverInputEventDataReceiver.test.ts delete mode 100644 ide/test/trace/database/data-trafic/ProcessDeliverInputEventDataSender.test.ts delete mode 100644 ide/test/trace/database/data-trafic/ProcessExpectedDataReceiver.test.ts delete mode 100644 ide/test/trace/database/data-trafic/ProcessExpectedDataSender.test.ts delete mode 100644 ide/test/trace/database/data-trafic/ProcessMemDataReceiver.test.ts delete mode 100644 ide/test/trace/database/data-trafic/ProcessMemDataSender.test.ts delete mode 100644 ide/test/trace/database/data-trafic/ProcessSoInitDataReceiver.test.ts delete mode 100644 ide/test/trace/database/data-trafic/ProcessSoInitDataSender.test.ts delete mode 100644 ide/test/trace/database/data-trafic/ProcessStartupDataReceiver.test.ts delete mode 100644 ide/test/trace/database/data-trafic/ProcessStartupDataSender.test.ts delete mode 100644 ide/test/trace/database/data-trafic/ThreadDataSender.test.ts delete mode 100644 ide/test/trace/database/data-trafic/VirtualMemoryDataReceiver.test.ts delete mode 100644 ide/test/trace/database/data-trafic/VirtualMemoryDataSender.test.ts delete mode 100644 ide/test/trace/database/data-trafic/VmTrackerDataReceiver.test.ts delete mode 100644 ide/test/trace/database/data-trafic/VmTrackerDataSender.test.ts diff --git a/ide/src/base-ui/drawer/LitDrawer.ts b/ide/src/base-ui/drawer/LitDrawer.ts index fa9626d5..b0893006 100644 --- a/ide/src/base-ui/drawer/LitDrawer.ts +++ b/ide/src/base-ui/drawer/LitDrawer.ts @@ -15,202 +15,208 @@ import { BaseElement, element } from '../BaseElement'; -const initHtmlStyle = (contentPadding:string, contentWidth:string) => { - return ` - - `; -} +let contentPadding = ''; +let contentWidth = ''; +let css = ` + +`; + +const initHtmlStyle = (padding: string, width: string) => { + contentPadding = padding; + contentWidth = width; + return css; +}; @element('lit-drawer') export class LitDrawer extends BaseElement { @@ -220,7 +226,7 @@ export class LitDrawer extends BaseElement { initHtml(): string { return ` - ${initHtmlStyle(this.contentPadding,this.contentWidth)} + ${initHtmlStyle(this.contentPadding, this.contentWidth)}
diff --git a/ide/src/base-ui/modal/LitModal.ts b/ide/src/base-ui/modal/LitModal.ts index 27eb5f18..b7960089 100644 --- a/ide/src/base-ui/modal/LitModal.ts +++ b/ide/src/base-ui/modal/LitModal.ts @@ -15,109 +15,113 @@ import { BaseElement, element } from '../BaseElement'; -const initHtmlStyle = (width:string) => { - return ` - - `; +let width = ''; +let css = ` + +` + +const initHtmlStyle = (wid: string) => { + width = wid; + return css; } @element('lit-modal') @@ -280,7 +284,7 @@ export class LitModal extends BaseElement { direction = this.onmousemoveFuncRule(direction,e,srcResizeRect,resizeWidth); this.resizingFunc(direction,e,srcResizeClientX,srcResizeClientY,srcResizeHeight,srcResizeWidth,srcResizeLeft,srcResizeTop); }; - this.setOnmousedownFunc(resizeWidth,srcResizeClientX,srcResizeClientY,srcResizeRect,srcResizeHeight,srcResizeWidth,srcResizeRight,srcResizeLeft,srcResizeTop); + this.setOnmousedownFunc(resizeWidth); this.onmouseupFunc = (e: any) => { this.resizing = false; }; @@ -494,48 +498,39 @@ export class LitModal extends BaseElement { } } - setOnmousedownFunc(resizeWidth:number,srcResizeClientX:number,srcResizeClientY:number,srcResizeRect:any,srcResizeHeight:number,srcResizeWidth:number,srcResizeRight:number,srcResizeLeft:number,srcResizeTop:number):void{ + setOnmousedownFunc(resizeWidth: number): void { this.onmousedownFunc = (e: any) => { - srcResizeRect = this.modalElement!.getBoundingClientRect(); - srcResizeClientX = e.clientX; - srcResizeClientY = e.clientY; - srcResizeHeight = srcResizeRect.height; - srcResizeWidth = srcResizeRect.width; - srcResizeRight = srcResizeRect.right; - srcResizeLeft = srcResizeRect.left; - srcResizeTop = srcResizeRect.top; + const srcResizeRect = this.modalElement!.getBoundingClientRect(); + const { clientX, clientY } = e; + const { left, right, top, bottom, width, height } = srcResizeRect; + const resizeRange = resizeWidth * 2; + + const isWithinRange = (coord: number, target: number, range: number) => + coord > target - range && coord < target + range; + + const isWithinCornerRange = (cornerX: number, cornerY: number) => + isWithinRange(clientX, cornerX, resizeRange) && + isWithinRange(clientY, cornerY, resizeRange); + + const isWithinTopLeft = isWithinCornerRange(left, top); + const isWithinTopRight = isWithinCornerRange(right, top); + const isWithinBottomLeft = isWithinCornerRange(left, bottom); + const isWithinBottomRight = isWithinCornerRange(right, bottom); + if ( - e.clientX > srcResizeRect.left - resizeWidth && - e.clientX < srcResizeRect.left + resizeWidth && - e.clientY > srcResizeRect.top - resizeWidth && - e.clientY < srcResizeRect.top + resizeWidth - ) { - this.resizing = true; - } else if ( - e.clientX > srcResizeRect.right - resizeWidth && - e.clientX < srcResizeRect.right + resizeWidth && - e.clientY > srcResizeRect.top - resizeWidth && - e.clientY < srcResizeRect.top + resizeWidth - ) { - this.resizing = true; - } else if ( - e.clientX > srcResizeRect.left - resizeWidth && - e.clientX < srcResizeRect.left + resizeWidth && - e.clientY > srcResizeRect.bottom - resizeWidth && - e.clientY < srcResizeRect.bottom + resizeWidth - ) { - this.resizing = true; - } else if ( - e.clientX > srcResizeRect.right - resizeWidth && - e.clientX < srcResizeRect.right + resizeWidth && - e.clientY > srcResizeRect.bottom - resizeWidth && - e.clientY < srcResizeRect.bottom + resizeWidth + isWithinTopLeft || + isWithinTopRight || + isWithinBottomLeft || + isWithinBottomRight ) { this.resizing = true; } else { - this.resizeIf(e,srcResizeRect,resizeWidth); + this.resizeIf(e, srcResizeRect, resizeWidth); + } + + if (this.resizing) { + document.body.style.userSelect = 'none'; } - if (this.resizing) document.body.style.userSelect = 'none'; }; } diff --git a/ide/src/base-ui/popover/LitPopoverV.ts b/ide/src/base-ui/popover/LitPopoverV.ts index acd2ef95..2376d82b 100644 --- a/ide/src/base-ui/popover/LitPopoverV.ts +++ b/ide/src/base-ui/popover/LitPopoverV.ts @@ -14,354 +14,356 @@ */ import { BaseElement, element } from '../BaseElement'; - -const initHtmlStyle = (width: string) => { - return ` - - `; +let width = ''; +let css = ` + +` +const initHtmlStyle = (wid: string) => { + width = wid; + return css; }; @element('lit-popover') diff --git a/ide/src/base-ui/select/LitAllocationSelect.ts b/ide/src/base-ui/select/LitAllocationSelect.ts index 13d5ad43..e1f783fb 100644 --- a/ide/src/base-ui/select/LitAllocationSelect.ts +++ b/ide/src/base-ui/select/LitAllocationSelect.ts @@ -15,93 +15,96 @@ import { BaseElement, element } from '../BaseElement'; -const initHtmlStyle = (listHeight: string) => { - return ` - - `; +let listHeight = ''; +let css = ` + +`; +const initHtmlStyle = (height: string): string => { + listHeight = height; + return css; }; @element('lit-allocation-select') diff --git a/ide/src/base-ui/select/LitSelectHtml.ts b/ide/src/base-ui/select/LitSelectHtml.ts index 5ac9ff91..dad54d68 100644 --- a/ide/src/base-ui/select/LitSelectHtml.ts +++ b/ide/src/base-ui/select/LitSelectHtml.ts @@ -13,204 +13,207 @@ * limitations under the License. */ -export const selectHtmlStr = (listHeight:string) :string=>{ - return ` - - `; -} + :host([rounded]) .body { + border-radius: 16px; + } + :host([rounded]) .root { + border-radius: 16px; + height: 25px; + } + .icon{ + pointer-events: none; + } + .noSelect{ + -moz-user-select:none; + -ms-user-select:none; + user-select:none; + -khtml-user-select:none; + -webkit-touch-callout:none; + -webkit-user-select:none; + } + + :host(:not([border]):not([disabled]):focus), + :host([border='true']:not([disabled]):focus), + :host(:not([border]):not([disabled]):hover), + :host([border='true']:not([disabled]):hover){ + border:1px solid var(--bark-prompt,#ccc) + } + :host(:not([disabled]):focus) .body, + :host(:not([disabled]):focus-within) .body{ + transform: scaleY(1); + opacity: 1; + z-index: 99; + visibility: visible; + } + :host(:not([disabled]):focus) input{ + color: var(--dark-color,#bebebe); + } + :host(:not([border])[disabled]) *, + :host([border='true'][disabled]) *{ + background-color: var(--dark-background1,#f5f5f5); + color: #b7b7b7; + cursor: not-allowed; + } + :host([border='false'][disabled]) *{ + color: #b7b7b7; + cursor: not-allowed; + } + :host(:not([mode])) input{ + width: 100%; + } + .body{ + max-height: ${listHeight}; + overflow: auto; + border-radius: 2px; + box-shadow: 0 5px 15px 0px #00000033; + } + .multipleRoot input::-webkit-input-placeholder { + color: var(--dark-color,#aab2bd); + } + :host(:not([loading])) .loading{ + display: none; + } + :host([loading]) .loading{ + display: flex; + } + :host(:not([allow-clear])) .clear{ + display: none; + } + :host([loading]) .icon{ + display: none; + } + :host(:not([loading])) .icon{ + display: flex; + } + .clear:hover{ + color: #8c8c8c; + } + .clear{ + color: #bfbfbf; + display: none; + } + .multipleRoot{ + display: flex; + align-items: center; + flex-flow: wrap; + flex-wrap: wrap; + flex-direction: column; + } + .search{ + color: #bfbfbf; + display: none; + } + .tag{ + overflow: auto; + height: auto; + display: inline-flex; + position: relative; + align-items: center; + font-size: .75rem; + font-weight: bold; + padding: 1px 4px; + margin-right: 4px; + margin-top: 1px; + margin-bottom: 1px; + color: #242424; + background-color: #f5f5f5; + } + .tag-close:hover{ + color: #333; + } + .tag-close{ + padding: 2px; + font-size: .8rem; + color: #999999; + margin-left: 0px; + } + +`; +export const selectHtmlStr = (height: string): string => { + listHeight = height; + return css; +}; export const selectVHtmlStr = ` - `; \ No newline at end of file + `; diff --git a/ide/src/base-ui/slider/LitSlider.ts b/ide/src/base-ui/slider/LitSlider.ts index 9858d681..c4328be7 100644 --- a/ide/src/base-ui/slider/LitSlider.ts +++ b/ide/src/base-ui/slider/LitSlider.ts @@ -15,107 +15,112 @@ import { BaseElement, element } from '../BaseElement'; -const initHtmlStyle = (colorStr: string | null,colorText: string | null) => { - return ` - - `; -} + :host(:focus-within) #slider-con,:host(:hover) #slider-con{ + z-index:10 + } + + :host([disabled]) #slider{ + opacity:0.6; + } + +`; +const initHtmlStyle = (str: string | null, text: string | null) => { + colorStr = str; + colorText = text; + return css; +}; @element('lit-slider') export class LitSlider extends BaseElement { @@ -147,7 +152,6 @@ export class LitSlider extends BaseElement { } } - set disabled(value) { if (value === null || value === false) { this.removeAttribute('disabled'); @@ -258,7 +262,10 @@ export class LitSlider extends BaseElement { initHtml(): string { return ` - ${initHtmlStyle(this.getAttribute('defaultColor') ? this.getAttribute('defaultColor') : '#46B1E3',this.getAttribute('defaultColor') ? this.getAttribute('defaultColor') : '#46B1E3')} + ${initHtmlStyle( + this.getAttribute('defaultColor') ? this.getAttribute('defaultColor') : '#46B1E3', + this.getAttribute('defaultColor') ? this.getAttribute('defaultColor') : '#46B1E3' + )}
diff --git a/ide/src/base-ui/tree/LitTree.ts b/ide/src/base-ui/tree/LitTree.ts index ddda51f2..9bc66d27 100644 --- a/ide/src/base-ui/tree/LitTree.ts +++ b/ide/src/base-ui/tree/LitTree.ts @@ -454,7 +454,23 @@ export class LitTree extends BaseElement { this.treeData.push(obj); } } - + insertNodeDragEvent(insertNode: LitTreeNode){ + if (this.hasAttribute('dragable')) { + insertNode.draggable = true; + document.ondragover = function (e): void { + e.preventDefault(); + }; + //在拖动目标上触发事件 (源元素) + insertNode.ondrag = (ev): void => this.onDrag(ev); //元素正在拖动时触发 + insertNode.ondragstart = (ev): undefined => this.onDragStart(ev); //用户开始拖动元素时触发 + insertNode.ondragend = (ev): undefined => this.onDragEnd(ev); // 用户完成元素拖动后触发 + //释放目标时触发的事件: + insertNode.ondragenter = (ev): undefined => this.onDragEnter(ev); //当被鼠标拖动的对象进入其容器范围内时触发此事件 + insertNode.ondragover = (ev): undefined => this.onDragOver(ev); //当某被拖动的对象在另一对象容器范围内拖动时触发此事件 + insertNode.ondragleave = (ev): undefined => this.onDragLeave(ev); //当被鼠标拖动的对象离开其容器范围内时触发此事件 + insertNode.ondrop = (ev): undefined => this.onDrop(ev); //在一个拖动过程中,释放鼠标键时触发此事件 + } + } _insertNode(parent: any, a: any): void { if (!parent) { parent = this.shadowRoot!.querySelector('#root'); diff --git a/ide/src/trace/bean/BoxSelection.ts b/ide/src/trace/bean/BoxSelection.ts index c02908b2..8dede09c 100644 --- a/ide/src/trace/bean/BoxSelection.ts +++ b/ide/src/trace/bean/BoxSelection.ts @@ -23,6 +23,16 @@ import { FrameSpacingStruct } from '../database/ui-worker/ProcedureWorkerFrameSp import { JsCpuProfilerChartFrame } from './JsStruct'; import { LogStruct } from '../database/ui-worker/ProcedureWorkerLog'; import { HiSysEventStruct } from '../database/ui-worker/ProcedureWorkerHiSysEvent'; +import {RangeSelectStruct, TraceRow} from "../component/trace/base/TraceRow"; +import {info} from "../../log/Log"; +import {SpSystemTrace} from "../component/SpSystemTrace"; +import {intersectData, isExistPidInArray, setSelectState} from "../component/Utils"; +import {TabPaneTaskFrames} from "../component/trace/sheet/task/TabPaneTaskFrames"; +import {JanksStruct} from "./JanksStruct"; +import {HeapDataInterface} from "../../js-heap/HeapDataInterface"; +import {LitTabs} from "../../base-ui/tabs/lit-tabs"; +import {TabPaneSummary} from "../component/trace/sheet/ark-ts/TabPaneSummary"; +import {JsCpuProfilerStruct} from "../database/ui-worker/ProcedureWorkerCpuProfiler"; export class SelectionParam { recordStartNs: number = 0; @@ -43,7 +53,6 @@ export class SelectionParam { staticInit: boolean = false; isRowClick: boolean = false; eventTypeId: string = ''; - cpus: Array = []; cpuStateRowsId: Array = []; //新增框选cpu freq row名 @@ -118,6 +127,871 @@ export class SelectionParam { sysAllEventsData: Array = []; sysAlllogsData: Array = []; hiSysEvents: Array = []; + pushCpus(it:TraceRow){ + if (it.rowType == TraceRow.ROW_TYPE_CPU) { + this.cpus.push(parseInt(it.rowId!)); + info('load CPU traceRow id is : ', it.rowId); + } + }; + + pushCpuStateFilterIds(it: TraceRow) { + if (it.rowType == TraceRow.ROW_TYPE_CPU_STATE) { + let filterId = parseInt(it.rowId!); + if (this.cpuStateFilterIds.indexOf(filterId) == -1) { + this.cpuStateFilterIds.push(filterId); + } + } + } + + pushCpuFreqFilter(it: TraceRow) { + if (it.rowType == TraceRow.ROW_TYPE_CPU_FREQ) { + let filterId = parseInt(it.rowId!); + let filterName = it.name!; + if (this.cpuFreqFilterIds.indexOf(filterId) == -1) { + this.cpuFreqFilterIds.push(filterId); + } + if (this.cpuFreqFilterNames.indexOf(filterName) == -1) { + this.cpuFreqFilterNames.push(filterName); + } + } + } + + pushCpuFreqLimit(it: TraceRow) { + if (it.rowType == TraceRow.ROW_TYPE_CPU_FREQ_LIMIT) { + this.cpuFreqLimit.push({ + maxFilterId: it.getAttribute('maxFilterId'), + minFilterId: it.getAttribute('minFilterId'), + cpu: it.getAttribute('cpu'), + }); + } + } + + pushProcess(it: TraceRow,sp:SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_PROCESS) { + sp.pushPidToSelection(this, it.rowId!); + if (it.getAttribute('hasStartup') === 'true') { + this.startup = true; + } + if (it.getAttribute('hasStaticInit') === 'true') { + this.staticInit = true; + } + let processChildRows: Array> = [ + ...sp.shadowRoot!.querySelectorAll>(`trace-row[row-parent-id='${it.rowId}']`), + ]; + if (!it.expansion) { + processChildRows = [...it.childrenList]; + } + processChildRows.forEach((th) => { + th.rangeSelect = true; + th.checkType = '2'; + if (th.rowType == TraceRow.ROW_TYPE_THREAD) { + this.threadIds.push(parseInt(th.rowId!)); + } else if (th.rowType == TraceRow.ROW_TYPE_FUNC) { + if (th.asyncFuncName) { + this.funAsync.push({ + name: th.asyncFuncName, + pid: th.asyncFuncNamePID || 0, + }); + } else { + this.funTids.push(parseInt(th.rowId!)); + } + } else if (th.rowType == TraceRow.ROW_TYPE_MEM) { + this.processTrackIds.push(parseInt(th.rowId!)); + } + }); + info('load process traceRow id is : ', it.rowId); + } + } + + pushNativeMemory(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_NATIVE_MEMORY) { + let memoryRows: Array> = [ + ...sp.shadowRoot!.querySelectorAll>(`trace-row[row-parent-id='${it.rowId}']`), + ]; + if (!it.expansion) { + memoryRows = [...it.childrenList]; + } + const rowKey = it.rowId!.split(' '); + const process = { + ipid: Number(rowKey[rowKey.length - 1]), + pid: Number(rowKey[rowKey.length - 2]), + }; + if (!isExistPidInArray(this.nativeMemoryAllProcess, process.pid)) { + this.nativeMemoryAllProcess.push(process); + } + if (this.nativeMemoryCurrentIPid === -1) { + this.nativeMemoryCurrentIPid = process.ipid; + } + memoryRows.forEach((th) => { + th.rangeSelect = true; + th.checkType = '2'; + if (th.getAttribute('heap-type') === 'native_hook_statistic') { + this.nativeMemoryStatistic.push(th.rowId!); + } else { + this.nativeMemory.push(th.rowId!); + } + }); + info('load nativeMemory traceRow id is : ', it.rowId); + } + } + + pushFunc(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_FUNC) { + TabPaneTaskFrames.TaskArray = []; + sp.pushPidToSelection(this, it.rowParentId!); + if (it.asyncFuncName) { + this.funAsync.push({ + name: it.asyncFuncName, + pid: it.asyncFuncNamePID || 0, + }); + } else { + this.funTids.push(parseInt(it.rowId!)); + } + + let isIntersect = (filterFunc: FuncStruct, rangeData: RangeSelectStruct) => + Math.max(filterFunc.startTs! + filterFunc.dur!, rangeData!.endNS || 0) - + Math.min(filterFunc.startTs!, rangeData!.startNS || 0) < + filterFunc.dur! + (rangeData!.endNS || 0) - (rangeData!.startNS || 0) && + filterFunc.funName!.indexOf('H:Task ') >= 0; + let taskData = it.dataListCache.filter((taskData: FuncStruct) => { + taskData!.tid = parseInt(it.rowId!); + return isIntersect(taskData, TraceRow.rangeSelectObject!); + }); + if (taskData.length > 0) { + this.taskFramesData.push(...taskData); + } + info('load func traceRow id is : ', it.rowId); + } + } + + pushHeap(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_HEAP) { + const key = it.rowParentId!.split(' '); + const process = { + ipid: Number(key[key.length - 1]), + pid: Number(key[key.length - 2]), + }; + + if (!isExistPidInArray(this.nativeMemoryAllProcess, process.pid)) { + this.nativeMemoryAllProcess.push(process); + } + if (this.nativeMemoryCurrentIPid === -1) { + this.nativeMemoryCurrentIPid = process.ipid; + } + if (this.nativeMemoryAllProcess) + if (it.getAttribute('heap-type') === 'native_hook_statistic') { + this.nativeMemoryStatistic.push(it.rowId!); + } else { + this.nativeMemory.push(it.rowId!); + } + info('load nativeMemory traceRow id is : ', it.rowId); + } + } + + pushMonitor(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_MONITOR) { + let abilityChildRows: Array> = [ + ...sp.shadowRoot!.querySelectorAll>(`trace-row[row-parent-id='${it.rowId}']`), + ]; + if (!it.expansion) { + abilityChildRows = [...it.childrenList]; + } + abilityChildRows.forEach((th) => { + th.rangeSelect = true; + th.checkType = '2'; + if (th.rowType == TraceRow.ROW_TYPE_CPU_ABILITY) { + this.cpuAbilityIds.push(th.rowId!); + } else if (th.rowType == TraceRow.ROW_TYPE_MEMORY_ABILITY) { + this.memoryAbilityIds.push(th.rowId!); + } else if (th.rowType == TraceRow.ROW_TYPE_DISK_ABILITY) { + this.diskAbilityIds.push(th.rowId!); + } else if (th.rowType == TraceRow.ROW_TYPE_NETWORK_ABILITY) { + this.networkAbilityIds.push(th.rowId!); + } else if (th.rowType == TraceRow.ROW_TYPE_DMA_ABILITY) { + this.dmaAbilityData.push(...intersectData(th)!); + } else if (th.rowType == TraceRow.ROW_TYPE_GPU_MEMORY_ABILITY) { + this.gpuMemoryAbilityData.push(...intersectData(th)!); + } else if (th.rowType === TraceRow.ROW_TYPE_PURGEABLE_TOTAL_ABILITY) { + this.purgeableTotalAbility.push(...intersectData(th)); + } else if (th.rowType === TraceRow.ROW_TYPE_PURGEABLE_PIN_ABILITY) { + this.purgeablePinAbility.push(...intersectData(th)); + } + }); + } + } + + pushHiperf(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType?.startsWith('hiperf')) { + if (it.rowType == TraceRow.ROW_TYPE_HIPERF_EVENT || it.rowType == TraceRow.ROW_TYPE_HIPERF_REPORT) { + return; + } + this.perfEventTypeId = it.drawType === -2 ? undefined : it.drawType; + this.perfSampleIds.push(1); + if (it.rowType === TraceRow.ROW_TYPE_PERF_CALLCHART) { + let setting = it.getRowSettingKeys(); + if (setting && setting.length > 0) { + //type 0:cpu,1:process,2:thread + let key: string = setting[0]; + let id = Number(key.split('-')[0]); + if (key.includes('p')) { + this.perfProcess.push(id); + } else if (key.includes('t')) { + this.perfThread.push(id); + } else { + this.perfCpus.push(id); + } + } + } + if (it.rowType == TraceRow.ROW_TYPE_HIPERF_PROCESS) { + let hiperfProcessRows: Array> = [ + ...sp.shadowRoot!.querySelectorAll>(`trace-row[row-parent-id='${it.rowId}']`), + ]; + if (!it.expansion) { + hiperfProcessRows = [...it.childrenList]; + } + hiperfProcessRows.forEach((th) => { + th.rangeSelect = true; + th.checkType = '2'; + }); + } + if (it.rowType == TraceRow.ROW_TYPE_HIPERF || it.rowId == 'HiPerf-cpu-merge') { + this.perfAll = true; + } + if (it.rowType == TraceRow.ROW_TYPE_HIPERF_CPU) { + this.perfCpus.push(it.index); + } + if (it.rowType == TraceRow.ROW_TYPE_HIPERF_PROCESS) { + this.perfProcess.push(parseInt(it.rowId!.split('-')[0])); + } + if (it.rowType == TraceRow.ROW_TYPE_HIPERF_THREAD) { + this.perfThread.push(parseInt(it.rowId!.split('-')[0])); + } + } + } + + pushFileSystem(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_FILE_SYSTEM) { + if (it.rowId == 'FileSystemLogicalWrite') { + if (this.fileSystemType.length == 0) { + this.fileSystemType = [0, 1, 3]; + } else { + if (this.fileSystemType.indexOf(3) == -1) { + this.fileSystemType.push(3); + } + } + } else if (it.rowId == 'FileSystemLogicalRead') { + if (this.fileSystemType.length == 0) { + this.fileSystemType = [0, 1, 2]; + } else { + if (this.fileSystemType.indexOf(2) == -1) { + this.fileSystemType.push(2); + } + } + } else if (it.rowId == 'FileSystemVirtualMemory') { + this.fileSysVirtualMemory = true; + } else if (it.rowId == 'FileSystemDiskIOLatency') { + this.diskIOLatency = true; + } else { + if (!this.diskIOLatency) { + let arr = it.rowId!.split('-').reverse(); + let ipid = parseInt(arr[0]); + if (this.diskIOipids.indexOf(ipid) == -1) { + this.diskIOipids.push(ipid); + } + if (arr[1] == 'read') { + this.diskIOReadIds.indexOf(ipid) == -1 ? this.diskIOReadIds.push(ipid) : ''; + } else if (arr[1] == 'write') { + this.diskIOWriteIds.indexOf(ipid) == -1 ? this.diskIOWriteIds.push(ipid) : ''; + } + } + } + } + } + vMTrackerGpuChildRowsEvery(item:TraceRow){ + item.rangeSelect = true; + if (item.rowType == TraceRow.ROW_TYPE_GPU_MEMORY_VMTRACKER) { + this.gpuMemoryTrackerData.push(...intersectData(item)!); + } else if (item.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_GL) { + this.gpu.gl = item.dataListCache.filter((it) => + (it.startNs >= this.leftNs && it.startNs <= this.rightNs) || + (it.endNs >= this.leftNs && it.endNs <= this.rightNs) + ).length > 0; + } else if (item.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_GRAPH) { + this.gpu.graph = + item.dataListCache.filter((it) => + (it.startNs >= this.leftNs && it.startNs <= this.rightNs) || + (it.endNs >= this.leftNs && it.endNs <= this.rightNs) + ).length > 0; + } else if (item.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_TOTAL) { + this.gpu.gpuTotal = + item.dataListCache.filter((it) => + (it.startNs >= this.leftNs && it.startNs <= this.rightNs) || + (it.endNs >= this.leftNs && it.endNs <= this.rightNs) + ).length > 0; + } else if (item.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_WINDOW) { + this.gpu.gpuWindow = item.dataListCache.filter((it) => + (it.startNs >= this.leftNs && it.startNs <= this.rightNs) || + (it.endNs >= this.leftNs && it.endNs <= this.rightNs) + ).length > 0; + } + } + pushVmTracker(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType === TraceRow.ROW_TYPE_VM_TRACKER) { + let vMTrackerChildRows: Array> = [ + ...sp.shadowRoot!.querySelectorAll>(`trace-row[row-parent-id='${it.rowId}']`), + ]; + if (!it.expansion) { + vMTrackerChildRows = [...it.childrenList]; + } + vMTrackerChildRows.forEach((th) => { + th.rangeSelect = true; + if (th.rowType === TraceRow.ROW_TYPE_DMA_VMTRACKER) { + this.dmaVmTrackerData.push(...intersectData(th)!); + } else if (th.rowType === TraceRow.ROW_TYPE_SYS_MEMORY_GPU) { + let vMTrackerGpuChildRows: Array> = [ + ...sp.shadowRoot!.querySelectorAll>(`trace-row[row-parent-id='${th.rowId}']`), + ]; + if (!th.expansion) { + vMTrackerGpuChildRows = [...th.childrenList]; + } + vMTrackerGpuChildRows.forEach((item) => { + this.vMTrackerGpuChildRowsEvery(item); + }); + } else if (th.rowType === TraceRow.ROW_TYPE_PURGEABLE_TOTAL_VM) { + this.purgeableTotalVM.push(...intersectData(th)); + } else if (th.rowType === TraceRow.ROW_TYPE_PURGEABLE_PIN_VM) { + this.purgeablePinVM.push(...intersectData(th)); + } else if (th.rowType === TraceRow.ROW_TYPE_VM_TRACKER_SMAPS) { + let sMapsChildRows: Array> = [ + ...sp.shadowRoot!.querySelectorAll>(`trace-row[row-parent-id='${th.rowId}']`), + ]; + if (!th.expansion) { + sMapsChildRows = [...th.childrenList]; + } + sMapsChildRows.forEach((item) => { + item.rangeSelect = true; + if (item.rowType == TraceRow.ROW_TYPE_VM_TRACKER_SMAPS) { + this.smapsType.push(...intersectData(item)!); + } + }); + } else if (th.rowType == TraceRow.ROW_TYPE_VMTRACKER_SHM) { + this.vmtrackershm.push(...intersectData(th)!); + } + }); + } + } + + pushJank(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_JANK) { + let isIntersect = (filterJank: JanksStruct, rangeData: RangeSelectStruct) => + Math.max(filterJank.ts! + filterJank.dur!, rangeData!.endNS || 0) - + Math.min(filterJank.ts!, rangeData!.startNS || 0) < + filterJank.dur! + (rangeData!.endNS || 0) - (rangeData!.startNS || 0); + if (it.name == 'Actual Timeline') { + if (it.rowParentId === 'frameTime') { + it.dataListCache.forEach((jankData: any) => { + if (isIntersect(jankData, TraceRow.rangeSelectObject!)) { + this.jankFramesData.push(jankData); + } + }); + } else { + this.jankFramesData.push(it.rowParentId); + } + } else if (it.folder) { + this.jankFramesData = []; + it.childrenList.forEach((child) => { + if (child.rowType == TraceRow.ROW_TYPE_JANK && child.name == 'Actual Timeline') { + if (it.rowParentId === 'frameTime') { + it.dataListCache.forEach((jankData: any) => { + if (isIntersect(jankData, TraceRow.rangeSelectObject!)) { + this.jankFramesData.push(jankData); + } + }); + } else { + this.jankFramesData.push(child.rowParentId); + } + } + }); + } + } + } + + pushHeapTimeline(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_HEAP_TIMELINE) { + let endNS = TraceRow.rangeSelectObject?.endNS ? TraceRow.rangeSelectObject?.endNS : TraceRow.range?.endNS; + let startNS = TraceRow.rangeSelectObject?.startNS + ? TraceRow.rangeSelectObject?.startNS + : TraceRow.range?.startNS; + let minNodeId, maxNodeId; + if (!it.dataListCache || it.dataListCache.length === 0) { + return; + } + for (let sample of it.dataListCache) { + if (sample.timestamp * 1000 <= startNS!) { + minNodeId = sample.lastAssignedId; + } + // 个别文件的sample的最大timestamp小于时间的框选结束时间,不能给maxNodeId赋值 + // 所以加上此条件:sample.timestamp === it.dataListCache[it.dataListCache.length -1].timestamp + if ( + sample.timestamp * 1000 >= endNS! || + sample.timestamp === it.dataListCache[it.dataListCache.length - 1].timestamp + ) { + if (maxNodeId === undefined) { + maxNodeId = sample.lastAssignedId; + } + } + } + + // If the start time range of the selected box is greater than the end time of the sampled data + if (startNS! >= it.dataListCache[it.dataListCache.length - 1].timestamp * 1000) { + minNodeId = it.dataListCache[it.dataListCache.length - 1].lastAssignedId; + } + // If you select the box from the beginning + if (startNS! <= TraceRow.range?.startNS!) { + minNodeId = HeapDataInterface.getInstance().getMinNodeId(sp.snapshotFiles!.id); + } + //If you select the box from the ending + if ( + endNS! >= TraceRow.range?.endNS! || + endNS! >= it.dataListCache[it.dataListCache.length - 1].timestampUs * 1000 + ) { + maxNodeId = HeapDataInterface.getInstance().getMaxNodeId(sp.snapshotFiles!.id); + } + let summary = (sp.traceSheetEL?.shadowRoot?.querySelector('#tabs') as LitTabs) + ?.querySelector('#box-heap-summary') + ?.querySelector('tabpane-summary') as TabPaneSummary; + summary.initSummaryData(sp.snapshotFiles!, minNodeId, maxNodeId); + this.jsMemory.push(1); + } + } + + pushJsCpuProfiler(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_JS_CPU_PROFILER) { + let isIntersect = (a: JsCpuProfilerStruct, b: RangeSelectStruct) => + Math.max(a.startTime! + a.totalTime!, b!.endNS || 0) - Math.min(a.startTime!, b!.startNS || 0) < + a.totalTime! + (b!.endNS || 0) - (b!.startNS || 0); + let frameSelectData = it.dataListCache.filter((frameSelectData: any) => { + return isIntersect(frameSelectData, TraceRow.rangeSelectObject!); + }); + let copyFrameSelectData = JSON.parse(JSON.stringify(frameSelectData)); + let frameSelectDataIdArr: Array = []; + for (let data of copyFrameSelectData) { + frameSelectDataIdArr.push(data.id); + } + let jsCpuProfilerData = copyFrameSelectData.filter((item: any) => { + if (item.depth === 0) { + setSelectState(item, frameSelectDataIdArr); + item.isSelect = true; + return item; + } + }); + this.jsCpuProfilerData = jsCpuProfilerData; + } + } + + pushSysMemoryGpu(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU) { + let vMTrackerGpuChildRows: Array> = [ + ...sp.shadowRoot!.querySelectorAll>(`trace-row[row-parent-id='${it.rowId}']`), + ]; + if (!it.expansion) { + vMTrackerGpuChildRows = [...it.childrenList]; + } + vMTrackerGpuChildRows.forEach((th) => { + th.rangeSelect = true; + if (th.rowType == TraceRow.ROW_TYPE_GPU_MEMORY_VMTRACKER) { + this.gpuMemoryTrackerData.push(...intersectData(th)!); + } else if (th.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_GL) { + this.gpu.gl = + th.dataListCache.filter( + (it) => + (it.startNs >= this.leftNs && it.startNs <= this.rightNs) || + (it.endNs >= this.leftNs && it.endNs <= this.rightNs) + ).length > 0; + } else if (th.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_GRAPH) { + this.gpu.graph = + th.dataListCache.filter( + (it) => + (it.startNs >= this.leftNs && it.startNs <= this.rightNs) || + (it.endNs >= this.leftNs && it.endNs <= this.rightNs) + ).length > 0; + } else if (th.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_TOTAL) { + this.gpu.gpuTotal = + th.dataListCache.filter( + (it) => + (it.startNs >= this.leftNs && it.startNs <= this.rightNs) || + (it.endNs >= this.leftNs && it.endNs <= this.rightNs) + ).length > 0; + } else if (th.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_WINDOW) { + this.gpu.gpuWindow = + th.dataListCache.filter( + (it) => + (it.startNs >= this.leftNs && it.startNs <= this.rightNs) || + (it.endNs >= this.leftNs && it.endNs <= this.rightNs) + ).length > 0; + } + }); + } + } + + pushSDK(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType?.startsWith(TraceRow.ROW_TYPE_SDK)) { + if (it.rowType == TraceRow.ROW_TYPE_SDK) { + let sdkRows: Array> = [ + ...sp.shadowRoot!.querySelectorAll>(`trace-row[row-parent-id='${it.rowId}']`), + ]; + if (!it.expansion) { + sdkRows = [...it.childrenList]; + } + sdkRows.forEach((th) => { + th.rangeSelect = true; + th.checkType = '2'; + }); + } + if (it.rowType == TraceRow.ROW_TYPE_SDK_COUNTER) { + this.sdkCounterIds.push(it.rowId!); + } + if (it.rowType == TraceRow.ROW_TYPE_SDK_SLICE) { + this.sdkSliceIds.push(it.rowId!); + } + } + } + + pushVmTrackerSmaps(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_VM_TRACKER_SMAPS) { + this.smapsType.push(...intersectData(it)!); + let sMapsChildRows: Array> = [ + ...sp.shadowRoot!.querySelectorAll>(`trace-row[row-parent-id='${it.rowId}']`), + ]; + if (!it.expansion) { + sMapsChildRows = [...it.childrenList]; + } + sMapsChildRows.forEach((item) => { + item.rangeSelect = true; + if (item.rowType == TraceRow.ROW_TYPE_VM_TRACKER_SMAPS) { + this.smapsType.push(...intersectData(item)!); + } + }); + } + } + + pushIrq(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_IRQ) { + if (it.getAttribute('cat') === 'irq') { + this.irqCallIds.push(parseInt(it.getAttribute('callId') || '-1')); + } else { + this.softIrqCallIds.push(parseInt(it.getAttribute('callId') || '-1')); + } + } + } + + pushSysMemoryGpuGl(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_GL) { + this.gpu.gl = + it.dataListCache.filter( + (it) => + (it.startNs >= this.leftNs && it.startNs <= this.rightNs) || + (it.endNs >= this.leftNs && it.endNs <= this.rightNs) + ).length > 0; + } + } + + pushFrameDynamic(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_FRAME_DYNAMIC) { + let appName = it.getAttribute('model-name'); + let isSelect = (dynamicStruct: FrameDynamicStruct, b: RangeSelectStruct) => + dynamicStruct.ts >= b.startNS! && dynamicStruct.ts <= b.endNS!; + let frameDynamicList = it.dataListCache.filter( + (frameAnimationBean: FrameDynamicStruct) => + isSelect(frameAnimationBean, TraceRow.rangeSelectObject!) && + frameAnimationBean.groupId !== -1 && + frameAnimationBean.appName === appName + ); + this.frameDynamic.push(...frameDynamicList); + } + } + + pushFrameSpacing(it: TraceRow) { + if (it.rowType == TraceRow.ROW_TYPE_FRAME_SPACING) { + let appName = it.getAttribute('model-name'); + let isSelect = (a: FrameSpacingStruct, b: RangeSelectStruct) => + a.currentTs >= b.startNS! && a.currentTs <= b.endNS!; + let frameDatas = it.dataListCache.filter((frameData: FrameSpacingStruct) => { + return ( + isSelect(frameData, TraceRow.rangeSelectObject!) && + frameData.groupId !== -1 && + frameData.frameSpacingResult !== -1 && + frameData.nameId === appName + ); + }); + this.frameSpacing.push(...frameDatas); + } + } + + pushFrameAnimation(it: TraceRow) { + if (it.rowType == TraceRow.ROW_TYPE_FRAME_ANIMATION) { + let isIntersect = (animationStruct: FrameAnimationStruct, selectStruct: RangeSelectStruct) => + Math.max(animationStruct.startTs! + animationStruct.dur!, selectStruct!.endNS || 0) - + Math.min(animationStruct.startTs!, selectStruct!.startNS || 0) < + animationStruct.dur! + (selectStruct!.endNS || 0) - (selectStruct!.startNS || 0); + let frameAnimationList = it.dataListCache.filter((frameAnimationBean: FrameAnimationStruct) => { + return isIntersect(frameAnimationBean, TraceRow.rangeSelectObject!); + }); + this.frameAnimation.push(...frameAnimationList); + } + } + + pushSysMemoryGpuWindow(it: TraceRow) { + if (it.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_WINDOW) { + this.gpu.gpuWindow = + it.dataListCache.filter( + (it) => + (it.startNs >= this.leftNs && it.startNs <= this.rightNs) || + (it.endNs >= this.leftNs && it.endNs <= this.rightNs) + ).length > 0; + } + } + + pushSysMemoryGpuTotal(it: TraceRow) { + if (it.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_TOTAL) { + this.gpu.gpuTotal = + it.dataListCache.filter( + (it) => + (it.startNs >= this.leftNs && it.startNs <= this.rightNs) || + (it.endNs >= this.leftNs && it.endNs <= this.rightNs) + ).length > 0; + } + } + + pushSysMemoryGpuGraph(it: TraceRow) { + if (it.rowType === TraceRow.ROW_TYPE_SYS_MEMORY_GPU_GRAPH) { + this.gpu.graph = + it.dataListCache.filter( + (it) => + (it.startNs >= this.leftNs && it.startNs <= this.rightNs) || + (it.endNs >= this.leftNs && it.endNs <= this.rightNs) + ).length > 0; + } + } + + pushStaticInit(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_STATIC_INIT) { + this.staticInit = true; + sp.pushPidToSelection(this, it.rowParentId!); + info('load thread traceRow id is : ', it.rowId); + } + } + + pushAppStartUp(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_APP_STARTUP) { + this.startup = true; + sp.pushPidToSelection(this, it.rowParentId!); + info('load thread traceRow id is : ', it.rowId); + } + } + + pushThread(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_THREAD) { + sp.pushPidToSelection(this, it.rowParentId!); + this.threadIds.push(parseInt(it.rowId!)); + info('load thread traceRow id is : ', it.rowId); + } + } + + pushVirtualMemory(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_MEM || it.rowType == TraceRow.ROW_TYPE_VIRTUAL_MEMORY) { + if (it.rowType == TraceRow.ROW_TYPE_MEM) { + this.processTrackIds.push(parseInt(it.rowId!)); + } else { + this.virtualTrackIds.push(parseInt(it.rowId!)); + } + info('load memory traceRow id is : ', it.rowId); + } + } + + pushFps(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_FPS) { + this.hasFps = true; + info('load FPS traceRow id is : ', it.rowId); + } + } + + pushCpuAbility(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_CPU_ABILITY) { + this.cpuAbilityIds.push(it.rowId!); + info('load CPU Ability traceRow id is : ', it.rowId); + } + } + + pushMemoryAbility(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_MEMORY_ABILITY) { + this.memoryAbilityIds.push(it.rowId!); + info('load Memory Ability traceRow id is : ', it.rowId); + } + } + + pushDiskAbility(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_DISK_ABILITY) { + this.diskAbilityIds.push(it.rowId!); + info('load DiskIo Ability traceRow id is : ', it.rowId); + } + } + + pushNetworkAbility(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_NETWORK_ABILITY) { + this.networkAbilityIds.push(it.rowId!); + info('load Network Ability traceRow id is : ', it.rowId); + } + } + + pushDmaAbility(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_DMA_ABILITY) { + this.dmaAbilityData.push(...intersectData(it)!); + } + } + + pushGpuMemoryAbility(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_GPU_MEMORY_ABILITY) { + this.gpuMemoryAbilityData.push(...intersectData(it)!); + } + } + + pushPowerEnergy(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_POWER_ENERGY) { + this.powerEnergy.push(it.rowId!); + } + } + + pushSystemEnergy(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_SYSTEM_ENERGY) { + this.systemEnergy.push(it.rowId!); + } + } + + pushAnomalyEnergy(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_ANOMALY_ENERGY) { + this.anomalyEnergy.push(it.rowId!); + } + } + + pushVmTrackerShm(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_VMTRACKER_SHM) { + this.vmtrackershm.push(...intersectData(it)!); + } + } + + pushClock(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_CLOCK) { + this.clockMapData.set(it.rowId || '', it.getCacheData); + } + } + + pushGpuMemoryVmTracker(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_GPU_MEMORY_VMTRACKER) { + this.gpuMemoryTrackerData.push(...intersectData(it)!); + } + } + + pushDmaVmTracker(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_DMA_VMTRACKER) { + this.dmaVmTrackerData.push(...intersectData(it)!); + } + } + + pushPugreable(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_PURGEABLE_TOTAL_ABILITY) { + this.purgeableTotalAbility.push(...intersectData(it)); + } + if (it.rowType == TraceRow.ROW_TYPE_PURGEABLE_PIN_ABILITY) { + this.purgeablePinAbility.push(...intersectData(it)); + } + if (it.rowType == TraceRow.ROW_TYPE_PURGEABLE_TOTAL_VM) { + this.purgeableTotalVM.push(...intersectData(it)); + } + if (it.rowType == TraceRow.ROW_TYPE_PURGEABLE_PIN_VM) { + this.purgeablePinVM.push(...intersectData(it)); + } + } + + pushPugreablePinAbility(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_PURGEABLE_PIN_ABILITY) { + this.purgeablePinAbility.push(...intersectData(it)); + } + } + + pushPugreableTotalVm(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_PURGEABLE_TOTAL_VM) { + this.purgeableTotalVM.push(...intersectData(it)); + } + } + + pushPugreablePinVm(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType == TraceRow.ROW_TYPE_PURGEABLE_PIN_VM) { + this.purgeablePinVM.push(...intersectData(it)); + } + } + + pushLogs(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType === TraceRow.ROW_TYPE_LOGS) { + this.hiLogs.push(it.rowId!); + } + } + + pushHiSysEvent(it: TraceRow, sp: SpSystemTrace) { + if (it.rowType === TraceRow.ROW_TYPE_HI_SYSEVENT) { + this.hiSysEvents.push(it.rowId!); + } + } + + pushSelection(it: TraceRow, sp: SpSystemTrace) { + this.pushCpus(it); + this.pushCpuStateFilterIds(it); + this.pushCpuFreqFilter(it); + this.pushCpuFreqLimit(it); + this.pushProcess(it,sp); + this.pushNativeMemory(it,sp); + this.pushFunc(it,sp); + this.pushHeap(it,sp); + this.pushMonitor(it,sp); + this.pushHiperf(it,sp); + this.pushFileSystem(it,sp); + this.pushJank(it,sp); + this.pushHeapTimeline(it,sp); + this.pushJsCpuProfiler(it,sp); + this.pushSysMemoryGpu(it, sp); + this.pushSDK(it, sp); + this.pushVmTrackerSmaps(it, sp); + this.pushIrq(it, sp); + this.pushSysMemoryGpuGl(it, sp); + this.pushFrameDynamic(it, sp); + this.pushFrameSpacing(it); + this.pushFrameAnimation(it); + this.pushSysMemoryGpuWindow(it); + this.pushSysMemoryGpuTotal(it); + this.pushSysMemoryGpuGraph(it); + this.pushStaticInit(it,sp); + this.pushAppStartUp(it,sp); + this.pushThread(it,sp); + this.pushVirtualMemory(it,sp); + this.pushFps(it,sp); + this.pushCpuAbility(it,sp); + this.pushMemoryAbility(it,sp); + this.pushDiskAbility(it,sp); + this.pushNetworkAbility(it,sp); + this.pushDmaAbility(it,sp); + this.pushGpuMemoryAbility(it,sp); + this.pushPowerEnergy(it,sp); + this.pushSystemEnergy(it,sp); + this.pushAnomalyEnergy(it,sp); + this.pushVmTracker(it,sp); + this.pushVmTrackerShm(it,sp); + this.pushClock(it,sp); + this.pushGpuMemoryVmTracker(it,sp); + this.pushDmaVmTracker(it,sp); + this.pushPugreable(it,sp); + this.pushLogs(it,sp); + this.pushHiSysEvent(it,sp); + } } export class BoxJumpParam { diff --git a/ide/src/trace/component/SpHelp.ts b/ide/src/trace/component/SpHelp.ts index 5d81388b..827319f3 100644 --- a/ide/src/trace/component/SpHelp.ts +++ b/ide/src/trace/component/SpHelp.ts @@ -50,522 +50,382 @@ export class SpHelp extends BaseElement { color.style.display = 'none'; header.style.display = 'none'; version.style.display = 'none'; + this.setupMainMenu(mainMenu, that); + mainMenu.style.width = '330px'; + let body = mainMenu.shadowRoot?.querySelector('.menu-body') as HTMLDivElement; + let groups = body.querySelectorAll('lit-main-menu-group'); + groups.forEach((value) => { + let items = value.querySelectorAll('lit-main-menu-item'); + items.forEach((item) => { + item.style.width = '330px'; + }); + if (value.title == 'TraceStreamer') { + let items = value.querySelectorAll('lit-main-menu-item'); + items.forEach((i) => { + if (i.title != 'TraceStreamer数据库说明') { + i.style.display = 'none'; + } + }); + } + if (value.title == 'SmartPerf') { + value.style.display = 'none'; + } + }); + } + + private setupMainMenu(mainMenu: LitMainMenu, that: this): void { mainMenu.menus = [ { collapsed: false, title: 'QuickStart', second: false, - icon:'caret-down', + icon: 'caret-down', describe: '', children: [ - { - collapsed: false, - title: '抓取和导入', - describe: '', - second: true, - icon:'caret-down', - children: [ - { - title: '设备端抓取trace说明', - icon: '', - clickHandler: function (item: MenuItem) { - SpStatisticsHttpUtil.addOrdinaryVisitAction({ - event: 'record', - action: 'help_doc', - }); - that.appContent!.innerHTML = - '('lit-main-menu-group'); - groups.forEach((value) => { - let items = value.querySelectorAll('lit-main-menu-item'); - items.forEach((item) => { - item.style.width = '330px'; - }); - if (value.title == 'TraceStreamer') { - let items = value.querySelectorAll('lit-main-menu-item'); - items.forEach((i) => { - if (i.title != 'TraceStreamer数据库说明') { - i.style.display = 'none'; - } - }); - } - if (value.title == 'SmartPerf') { - value.style.display = 'none'; - } + } + + private setupCaptureAndImportMenu(that: this) { + return { + collapsed: false, + title: '抓取和导入', + describe: '', + second: true, + icon: 'caret-down', + children: [ + { + title: '设备端抓取trace说明', + icon: '', + clickHandler: function (item: MenuItem) { + that.handleMemoryMenuItemClick(that, 'record', 'quickstart_device_record'); + }, + }, + { + title: 'web端抓取trace说明', + icon: '', + clickHandler: function (item: MenuItem) { + that.handleMemoryMenuItemClick(that, 'online_record', 'quickstart_web_record'); + }, + }, + { + title: 'web端加载trace说明', + icon: '', + clickHandler: function (item: MenuItem) { + that.handleMemoryMenuItemClick(that, 'load', 'quickstart_systemtrace'); + }, + }, + ], + }; + } + + private setupOtherMenu(that: this) { + return { + collapsed: false, + title: '其他', + describe: '', + icon: 'caret-down', + second: true, + children: this.setupOtherMenuItems(that), + }; + } + private setupOtherMenuItems(that: this): MenuItem[] { + return [ + this.createSubMenuItem('Sql分析和Metrics说明', 'sql', 'quickstart_sql_metrics', that), + this.createSubMenuItem('HiSystemEvent抓取和展示说明', 'hisys', 'quickstart_hisystemevent', that), + this.createSubMenuItem('sdk抓取和展示说明', 'sdk_record', 'quickstart_sdk', that), + this.createSubMenuItem('调用栈可视化和不同库函数调用占比说明', 'import_so', 'quickstart_Import_so', that), + this.createSubMenuItem('Hilog抓取和展示说明', 'hilog', 'quickstart_hilog', that), + this.createSubMenuItem('Ability Monitor抓取和展示说明', 'ability', 'quickstart_ability_monitor', that), + this.createSubMenuItem('Trace解析能力增强', 'trace_parsing', 'quickstart_parsing_ability', that), + this.createSubMenuItem('应用操作技巧', 'operation_skills', 'quickstart_Application_operation_skills', that), + this.createSubMenuItem('快捷键说明', 'keywords_shortcuts', 'quickstart_keywords_shortcuts', that), + ]; + } + + private createSubMenuItem(title: string, event: string, docName: string, that: this): MenuItem { + return { + title: title, + icon: '', + clickHandler: (item: MenuItem) => { + that.handleMemoryMenuItemClick(that, event, docName); + }, + }; + } + + + private setupMemoryMenu(that: this) { + return { + collapsed: false, + title: '内存', + describe: '', + icon: 'caret-down', + second: true, + children: [ + { + title: 'Js Memory抓取和展示说明', + icon: '', + clickHandler: function (item: MenuItem) { + that.handleMemoryMenuItemClick(that, 'js_memory', 'quickstart_Js_memory'); + }, + }, + { + title: 'Native Memory抓取和展示说明', + icon: '', + clickHandler: function (item: MenuItem) { + that.handleMemoryMenuItemClick(that, 'native', 'quickstart_native_memory'); + }, + }, + { + title: '页内存抓取和展示说明', + icon: '', + clickHandler: function (item: MenuItem) { + that.handleMemoryMenuItemClick(that, 'virtual_memory', 'quickstart_page_fault'); + }, + }, + { + title: '系统内存抓取和展示说明', + icon: '', + clickHandler: function (item: MenuItem) { + that.handleMemoryMenuItemClick(that, 'memory_template', 'quickstart_memory_template'); + }, + }, + ], + }; + } + + private handleMemoryMenuItemClick(that: this, event: string, docName: string): void { + SpStatisticsHttpUtil.addOrdinaryVisitAction({ + event: event, + action: 'help_doc', }); + that.appContent!.innerHTML = + ``; + } + + private setupNativeMenu(that: this) { + return { + collapsed: false, + title: 'Native栈', + describe: '', + second: true, + icon: 'caret-down', + children: [ + { + title: 'HiPerf的抓取和展示说明', + icon: '', + clickHandler: function (item: MenuItem) { + that.handleMemoryMenuItemClick(that, 'perf', 'quickstart_hiperf'); + }, + }, + ], + } + } + + private setupTsMenu(that: this) { + return { + collapsed: false, + title: 'TS栈', + describe: '', + second: true, + icon: 'caret-down', + children: [ + { + title: 'Cpuprofiler抓取和展示说明', + icon: '', + clickHandler: function (item: MenuItem) { + that.handleMemoryMenuItemClick(that, 'arkts', 'quickstart_arkts'); + }, + }, + ], + } + } + + private setupAnalysisTemplateMenu(that: this) { + return { + collapsed: false, + title: '分析模板', + describe: '', + second: true, + icon: 'caret-down', + children: [ + { + title: 'Frame timeline抓取和展示说明', + icon: '', + clickHandler: function (item: MenuItem) { + that.handleMemoryMenuItemClick(that, 'frame_record', 'quickstart_Frametimeline'); + }, + }, + { + title: 'Animation的抓取和展示说明', + icon: '', + clickHandler: function (item: MenuItem) { + that.handleMemoryMenuItemClick(that, 'animation', 'quickstart_animation'); + }, + }, + { + title: 'TaskPool抓取和展示说明', + icon: '', + clickHandler: function (item: MenuItem) { + that.handleMemoryMenuItemClick(that, 'taskpool', 'quickstart_taskpool'); + }, + }, + { + title: 'App startup的抓取和展示说明', + icon: '', + clickHandler: function (item: MenuItem) { + that.handleMemoryMenuItemClick(that, 'app_startup', 'quickstart_app_startup'); + }, + }, + { + title: 'Scheduling analysis抓取和展示说明', + icon: '', + clickHandler: function (item: MenuItem) { + that.handleMemoryMenuItemClick(that, 'scheduling_record', 'quickstart_schedulinganalysis'); + }, + }, + ], + } + } + + private setupFileMenu(that: this) { + return { + collapsed: false, + title: '文件', + describe: '', + second: true, + icon: 'caret-down', + children: [ + { + title: 'FileSystem抓取和展示说明', + icon: '', + clickHandler: function (item: MenuItem) { + that.handleMemoryMenuItemClick(that, 'file_system', 'quickstart_filesystem'); + }, + }, + { + title: 'Bio抓取和展示说明', + icon: '', + clickHandler: function (item: MenuItem) { + that.handleMemoryMenuItemClick(that, 'bio', 'quickstart_bio'); + }, + }, + ], + } + } + + private setupDatabaseMenu(that: this) { + return { + title: 'TraceStreamer数据库说明', + icon: '', + clickHandler: function (item: MenuItem) { + that.handleMemoryMenuItemClick(that, 'trace_streamer_explain', 'des_tables'); + }, + }; + } + + private setupCompileMenu(that: this) { + return { + title: '编译Trace_streamer', + icon: '', + clickHandler: function (item: MenuItem) { + that.handleMemoryMenuItemClick(that, 'trace_streamer_compile', 'compile_trace_streamer'); + }, + }; + } + + private setupAnalysisMenu(that: this) { + return { + title: 'TraceStreamer 解析数据状态表', + icon: '', + clickHandler: function (item: MenuItem) { + that.handleMemoryMenuItemClick(that, 'trace_streamer_des', 'des_stat'); + }, + }; + } + + private setupSmartPerfMenu(that: this) { + return { + title: 'SmartPerf 编译指导', + icon: '', + clickHandler: function (item: MenuItem) { + that.handleMemoryMenuItemClick(that, 'smartperf_guide', 'quickstart_smartperflinux_compile_guide'); + }, + }; + } + + private setupEventListMenu(that: this) { + return { + title: 'TraceStreamer支持解析事件列表', + icon: '', + clickHandler: function (item: MenuItem) { + that.handleMemoryMenuItemClick(that, 'support_event', 'des_support_event'); + }, + } + } + + private setupToolDescriptionMenu(that: this) { + return { + title: 'trace_streamer工具说明', + icon: '', + clickHandler: function (item: MenuItem) { + that.handleMemoryMenuItemClick(that, 'quickstart_trace_streamer', 'quickstart_trace_streamer'); + }, + }; + } + + private setupBinderMenu(that: this) { + return { + title: 'binder事件上下文如何关联', + icon: '', + clickHandler: function (item: MenuItem) { + that.handleMemoryMenuItemClick(that, 'binder', 'des_binder'); + }, + }; + } + + private setupWakeUpMenu(that: this) { + return { + title: 'wakeup唤醒说明', + icon: '', + clickHandler: function (item: MenuItem) { + that.handleMemoryMenuItemClick(that, 'wakeup', 'des_wakup'); + }, + }; } initHtml(): string { diff --git a/ide/src/trace/component/SpInfoAndStas.html.ts b/ide/src/trace/component/SpInfoAndStas.html.ts new file mode 100644 index 00000000..c6664aa8 --- /dev/null +++ b/ide/src/trace/component/SpInfoAndStas.html.ts @@ -0,0 +1,133 @@ +/* + * Copyright (C) 2022 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. + */ + +export const SpInfoAndStatHtml = ` +
+ + +
+` diff --git a/ide/src/trace/component/SpInfoAndStas.ts b/ide/src/trace/component/SpInfoAndStas.ts index b357ed34..6e64e3f1 100644 --- a/ide/src/trace/component/SpInfoAndStas.ts +++ b/ide/src/trace/component/SpInfoAndStas.ts @@ -18,7 +18,8 @@ import { LitTable } from '../../base-ui/table/lit-table'; import '../../base-ui/table/lit-table'; import { info } from '../../log/Log'; import { LitProgressBar } from '../../base-ui/progress-bar/LitProgressBar'; -import {querySelectTraceStats, queryTraceMetaData} from "../database/sql/SqlLite.sql"; +import { querySelectTraceStats, queryTraceMetaData } from '../database/sql/SqlLite.sql'; +import { SpInfoAndStatHtml } from './SpInfoAndStas.html'; @element('sp-info-and-stats') export class SpInfoAndStats extends BaseElement { @@ -119,125 +120,7 @@ export class SpInfoAndStats extends BaseElement { } initHtml(): string { - return ` - -
- - -
- `; + return SpInfoAndStatHtml; } } diff --git a/ide/src/trace/component/SpKeyboard.html.ts b/ide/src/trace/component/SpKeyboard.html.ts new file mode 100644 index 00000000..2f004d95 --- /dev/null +++ b/ide/src/trace/component/SpKeyboard.html.ts @@ -0,0 +1,201 @@ +/* + * Copyright (C) 2022 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. + */ + +export const SpKeyboardHtml = ` + +
+
+
+
+

SmartPerf help

+ +
+
+
+

Navigation

+ + + + + + + + + +
+
w
/ +
s
+
放大/缩小
+
a
/ +
d
+
左移/右移
+

Mouse Controls

+ + + + + + + + + + + + + + + + + +
Click点选
Click + Drag框选
Ctrl + Scroll wheel放大/缩小
Ctrl + Click + Drag拖拽左移/右移
+

Making SQL queries from the query page

+ + + + + +
+
Ctrl
+ +
Enter
+
在数据库查询界面写好查询语句后进行查询
+

Other

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+
f
(with event selected) +
聚焦
+
m
(with event or area selected) +
临时框选标记
+
Shift
+ +
m
(with event or area selected) +
永久框选标记
+
Ctrl
+ +
,
/ +
.
+
定位到上一个/下一个旗子标记的时间点
+
Ctrl
+ +
[
/ +
]
+
定位到上一个/下一个用shift + m 框选的位置
+
?
+
展示快捷方式
+
v
+
展示/隐藏Vsync信号
+
+
+
+
+`; diff --git a/ide/src/trace/component/SpKeyboard.ts b/ide/src/trace/component/SpKeyboard.ts index dac46503..15467827 100644 --- a/ide/src/trace/component/SpKeyboard.ts +++ b/ide/src/trace/component/SpKeyboard.ts @@ -14,6 +14,8 @@ */ import { BaseElement, element } from '../../base-ui/BaseElement'; +import { SpKeyboardHtml } from './SpKeyboard.html'; + @element('sp-keyboard') export class SpKeyboard extends BaseElement { initElements(): void { @@ -21,10 +23,10 @@ export class SpKeyboard extends BaseElement { parentElement.style.overflow = 'hidden'; let closeWindow = this.shadowRoot?.querySelector('.close-icon'); let keyboardDiv = document - .querySelector('body > sp-application')! + .querySelector('body > sp-application')! .shadowRoot!.querySelector('#sp-keyboard')!; let welcomeDiv = document - .querySelector('body > sp-application')! + .querySelector('body > sp-application')! .shadowRoot!.querySelector('#sp-welcome')!; let shadow_box = this.shadowRoot?.querySelector('.shadow-box')!; closeWindow!.addEventListener('click', () => { @@ -36,197 +38,8 @@ export class SpKeyboard extends BaseElement { welcomeDiv.style.visibility = 'visible'; }); } + initHtml(): string { - return ` - ${this.initHtmlStyle()} -
-
-
-
-

SmartPerf help

- -
-
-
-

Navigation

- - - - - - - - - -
-
w
/ -
s
-
放大/缩小
-
a
/ -
d
-
左移/右移
-

Mouse Controls

- - - - - - - - - - - - - - - - - -
Click点选
Click + Drag框选
Ctrl + Scroll wheel放大/缩小
Ctrl + Click + Drag拖拽左移/右移
-

Making SQL queries from the query page

- - - - - -
-
Ctrl
+ -
Enter
-
在数据库查询界面写好查询语句后进行查询
-

Other

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-
f
(with event selected) -
聚焦
-
m
(with event or area selected) -
临时框选标记
-
Shift
+ -
m
(with event or area selected) -
永久框选标记
-
Ctrl
+ -
,
/ -
.
-
定位到上一个/下一个旗子标记的时间点
-
Ctrl
+ -
[
/ -
]
-
定位到上一个/下一个用shift + m 框选的位置
-
?
-
展示快捷方式
-
v
-
展示/隐藏Vsync信号
-
-
-
-
- `; - } - private initHtmlStyle(): string { - return ` - - `; + return SpKeyboardHtml; } } diff --git a/ide/src/trace/component/SpMetrics.html.ts b/ide/src/trace/component/SpMetrics.html.ts new file mode 100644 index 00000000..ad6ef40c --- /dev/null +++ b/ide/src/trace/component/SpMetrics.html.ts @@ -0,0 +1,145 @@ +/* + * Copyright (C) 2022 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. + */ + +export const SpMetricsHtml = ` + +
+
+

Select a metric

+ + + +
+
+ +
+
+` diff --git a/ide/src/trace/component/SpMetrics.ts b/ide/src/trace/component/SpMetrics.ts index f7d0110b..ff42c7fd 100644 --- a/ide/src/trace/component/SpMetrics.ts +++ b/ide/src/trace/component/SpMetrics.ts @@ -18,7 +18,8 @@ import { BaseElement, element } from '../../base-ui/BaseElement'; import '../../base-ui/table/lit-table'; import { LitProgressBar } from '../../base-ui/progress-bar/LitProgressBar'; import { SpStatisticsHttpUtil } from '../../statistics/util/SpStatisticsHttpUtil'; -import {queryMetric} from "../database/sql/SqlLite.sql"; +import { queryMetric } from '../database/sql/SqlLite.sql'; +import { SpMetricsHtml } from './SpMetrics.html'; @element('sp-metrics') export class SpMetrics extends BaseElement { @@ -67,135 +68,6 @@ export class SpMetrics extends BaseElement { } initHtml(): string { - return ` - -
-
-

Select a metric

- - - -
-
- -
-
- `; + return SpMetricsHtml; } } diff --git a/ide/src/trace/component/SpQuerySQL.html.ts b/ide/src/trace/component/SpQuerySQL.html.ts new file mode 100644 index 00000000..b6960db7 --- /dev/null +++ b/ide/src/trace/component/SpQuerySQL.html.ts @@ -0,0 +1,197 @@ +/* + * Copyright (C) 2022 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. + */ + +export const SpQuerySQLHtml = ` + +
+
+

Enter query and press command/ctrl + Enter

+ + +
+
+
+

Query result - 0 counts

+
+ + +
+
+
+ +
+ +
+
+
+
+` diff --git a/ide/src/trace/component/SpQuerySQL.ts b/ide/src/trace/component/SpQuerySQL.ts index 4158fe26..c7de41d1 100644 --- a/ide/src/trace/component/SpQuerySQL.ts +++ b/ide/src/trace/component/SpQuerySQL.ts @@ -25,6 +25,7 @@ import { SpStatisticsHttpUtil } from '../../statistics/util/SpStatisticsHttpUtil import { getAllSql } from './trace/base/CommonSql'; import { LitIcon } from '../../base-ui/icon/LitIcon'; import {queryCustomizeSelect} from "../database/sql/SqlLite.sql"; +import { SpQuerySQLHtml } from './SpQuerySQL.html'; @element('sp-query-sql') export class SpQuerySQL extends BaseElement { @@ -346,188 +347,7 @@ export class SpQuerySQL extends BaseElement { } initHtml(): string { - return ` - -
-
-

Enter query and press command/ctrl + Enter

- - -
-
-
-

Query result - 0 counts

-
- - -
-
-
- -
- -
-
-
-
- `; + return SpQuerySQLHtml; } } diff --git a/ide/src/trace/component/SpSystemTrace.event.ts b/ide/src/trace/component/SpSystemTrace.event.ts index c3a4809c..2e19deaf 100644 --- a/ide/src/trace/component/SpSystemTrace.event.ts +++ b/ide/src/trace/component/SpSystemTrace.event.ts @@ -13,48 +13,34 @@ * limitations under the License. */ -import { SpSystemTrace } from './SpSystemTrace'; -import { ThreadStruct } from '../database/ui-worker/ProcedureWorkerThread'; -import { TraceRow } from './trace/base/TraceRow'; -import { JankStruct } from '../database/ui-worker/ProcedureWorkerJank'; -import { HeapSnapshotStruct } from '../database/ui-worker/ProcedureWorkerHeapSnapshot'; -import { FuncStruct } from '../database/ui-worker/ProcedureWorkerFunc'; -import { TabPaneTaskFrames } from './trace/sheet/task/TabPaneTaskFrames'; -import { FlagsConfig } from './SpFlags'; -import { CpuFreqStruct } from '../database/ui-worker/ProcedureWorkerFreq'; -import { ClockStruct } from '../database/ui-worker/ProcedureWorkerClock'; -import { SnapshotStruct } from '../database/ui-worker/ProcedureWorkerSnapshot'; -import { IrqStruct } from '../database/ui-worker/ProcedureWorkerIrq'; -import { HeapStruct } from '../database/ui-worker/ProcedureWorkerHeap'; -import { JsCpuProfilerStruct } from '../database/ui-worker/ProcedureWorkerCpuProfiler'; -import { JsCpuProfilerChartFrame } from '../bean/JsStruct'; -import { AppStartupStruct } from '../database/ui-worker/ProcedureWorkerAppStartup'; -import { AllAppStartupStruct } from '../database/ui-worker/ProcedureWorkerAllAppStartup'; -import { SoStruct } from '../database/ui-worker/ProcedureWorkerSoInit'; -import { FrameAnimationStruct } from '../database/ui-worker/ProcedureWorkerFrameAnimation'; -import { FrameDynamicStruct } from '../database/ui-worker/ProcedureWorkerFrameDynamic'; -import { FrameSpacingStruct } from '../database/ui-worker/ProcedureWorkerFrameSpacing'; -import { SportRuler } from './trace/timer-shaft/SportRuler'; -import { SpStatisticsHttpUtil } from '../../statistics/util/SpStatisticsHttpUtil'; -import { LitSearch } from './trace/search/Search'; -import { TabPaneCurrent } from './trace/sheet/TabPaneCurrent'; -import type { SpKeyboard } from './SpKeyboard'; -import { enableVSync } from './chart/VSync'; -import { CpuStruct } from '../database/ui-worker/cpu/ProcedureWorkerCPU'; -import { CpuStateStruct } from '../database/ui-worker/cpu/ProcedureWorkerCpuState'; -import { CpuFreqLimitsStruct } from '../database/ui-worker/cpu/ProcedureWorkerCpuFreqLimits'; +import {SpSystemTrace} from "./SpSystemTrace"; +import {ThreadStruct, ThreadStructOnClick} from "../database/ui-worker/ProcedureWorkerThread"; +import {TraceRow} from "./trace/base/TraceRow"; +import {JankStruct, JankStructOnClick} from "../database/ui-worker/ProcedureWorkerJank"; +import {HeapSnapshotStruct, HeapSnapshotStructOnClick} from "../database/ui-worker/ProcedureWorkerHeapSnapshot"; +import {FuncStructOnClick} from "../database/ui-worker/ProcedureWorkerFunc"; +import {CpuFreqStructOnClick} from "../database/ui-worker/ProcedureWorkerFreq"; +import {ClockStructOnClick} from "../database/ui-worker/ProcedureWorkerClock"; +import {SnapshotStructOnClick} from "../database/ui-worker/ProcedureWorkerSnapshot"; +import {IrqStructOnClick} from "../database/ui-worker/ProcedureWorkerIrq"; +import {HeapStructOnClick} from "../database/ui-worker/ProcedureWorkerHeap"; +import {JsCpuProfilerStructOnClick} from "../database/ui-worker/ProcedureWorkerCpuProfiler"; +import {AppStartupStructOnClick} from "../database/ui-worker/ProcedureWorkerAppStartup"; +import {SoStructOnClick} from "../database/ui-worker/ProcedureWorkerSoInit"; +import {FrameAnimationStructOnClick} from "../database/ui-worker/ProcedureWorkerFrameAnimation"; +import {FrameDynamicStructOnClick} from "../database/ui-worker/ProcedureWorkerFrameDynamic"; +import {FrameSpacingStructOnClick} from "../database/ui-worker/ProcedureWorkerFrameSpacing"; +import {SportRuler} from "./trace/timer-shaft/SportRuler"; +import {SpStatisticsHttpUtil} from "../../statistics/util/SpStatisticsHttpUtil"; +import {LitSearch} from "./trace/search/Search"; +import {TabPaneCurrent} from "./trace/sheet/TabPaneCurrent"; +import type {SpKeyboard} from "./SpKeyboard"; +import {enableVSync} from "./chart/VSync"; +import {CpuStruct, CpuStructOnClick} from "../database/ui-worker/cpu/ProcedureWorkerCPU"; +import {CpuStateStructOnClick} from "../database/ui-worker/cpu/ProcedureWorkerCpuState"; +import {CpuFreqLimitsStructOnClick} from "../database/ui-worker/cpu/ProcedureWorkerCpuFreqLimits"; -export default function SpSystemTraceOnClickHandler(sp: SpSystemTrace, clickRowType: string, row?: TraceRow) { - if (row) { - sp.currentRow = row; - sp.setAttribute('clickRow', clickRowType); - sp.setAttribute('rowName', row.name!); - sp.setAttribute('rowId', row.rowId!); - } - if (!sp.loadTraceCompleted) return; - sp.queryAllTraceRow().forEach((it) => (it.rangeSelect = false)); - sp.selectStructNull(); - // 判断点击的线程是否在唤醒树内 +function timeoutJudge(sp: SpSystemTrace) { let timeoutJudge = setTimeout(() => { if (SpSystemTrace.wakeupList.length && CpuStruct.selectCpuStruct) { let checkHandlerKey: boolean = true; @@ -92,12 +78,11 @@ export default function SpSystemTraceOnClickHandler(sp: SpSystemTrace, clickRowT } clearTimeout(timeoutJudge); }, 10); - let threadClickHandler: any; - let cpuClickHandler: any; - let jankClickHandler: any; - let snapshotClickHandler: any; - let scrollToFuncHandler: any; - threadClickHandler = (d: ThreadStruct) => { + return timeoutJudge; +} + +function threadClickHandlerFunc(sp: SpSystemTrace) { + let threadClickHandler = (d: ThreadStruct) => { sp.observerScrollHeightEnable = false; sp.scrollToProcess(`${d.cpu}`, '', 'cpu-data', true); let cpuRow = sp.queryAllTraceRow>( @@ -129,9 +114,7 @@ export default function SpSystemTraceOnClickHandler(sp: SpSystemTrace, clickRowT findEntry!.startTime! + findEntry!.dur! + findEntry!.dur! * 2 ); } - sp.hoverStructNull(); - sp.selectStructNull(); - sp.wakeupListNull(); + sp.hoverStructNull().selectStructNull().wakeupListNull(); CpuStruct.hoverCpuStruct = findEntry; CpuStruct.selectCpuStruct = findEntry; sp.timerShaftEL?.drawTriangle(findEntry!.startTime || 0, 'inverted'); @@ -142,75 +125,22 @@ export default function SpSystemTraceOnClickHandler(sp: SpSystemTrace, clickRowT CpuStruct.wakeupBean = wakeUpBean; sp.refreshCanvas(true); }, - cpuClickHandler + cpuClickHandlerFunc(sp) ); }; - cpuClickHandler = (d: CpuStruct) => { - let traceRow = sp.shadowRoot?.querySelector>( - `trace-row[row-id='${d.processId}'][row-type='process']` - ); - if (traceRow) { - traceRow.expansion = true; - } - sp.observerScrollHeightEnable = true; - let threadRow = sp.queryAllTraceRow>( - `trace-row[row-id='${d.tid}'][row-type='thread']`, - (row) => row.rowId === `${d.tid}` && row.rowType === 'thread' - )[0]; - let task = () => { - if (threadRow) { - let findEntry = threadRow!.fixedList[0]; - if ( - findEntry!.startTime! + findEntry!.dur! < TraceRow.range!.startNS || - findEntry!.startTime! > TraceRow.range!.endNS - ) { - sp.timerShaftEL?.setRangeNS( - findEntry!.startTime! - findEntry!.dur! * 2, - findEntry!.startTime! + findEntry!.dur! + findEntry!.dur! * 2 - ); - } - sp.hoverStructNull(); - sp.selectStructNull(); - sp.wakeupListNull(); - ThreadStruct.hoverThreadStruct = findEntry; - ThreadStruct.selectThreadStruct = findEntry; - sp.timerShaftEL?.drawTriangle(findEntry!.startTime || 0, 'inverted'); - sp.traceSheetEL?.displayThreadData( - ThreadStruct.selectThreadStruct!, - threadClickHandler, - cpuClickHandler, - (datas) => { - sp.removeLinkLinesByBusinessType('thread'); - } - ); - sp.scrollToProcess(`${d.tid}`, `${d.processId}`, 'thread', true); - } - }; - if (threadRow) { - threadRow.fixedList = [ - { - startTime: d.startTime, - dur: d.dur, - cpu: d.cpu, - id: d.id, - tid: d.tid, - state: d.state, - pid: d.processId, - argSetID: d.argSetID, - }, - ]; + return threadClickHandler; +} - if (threadRow!.isComplete) { - task(); - } else { - sp.scrollToProcess(`${d.tid}`, `${d.processId}`, 'process', false); - sp.scrollToProcess(`${d.tid}`, `${d.processId}`, 'thread', true); - threadRow!.onComplete = task; - } - } +function scrollToFuncHandlerFunc(sp: SpSystemTrace) { + return function (funcStruct: any) { + sp.observerScrollHeightEnable = true; + sp.moveRangeToCenter(funcStruct.startTs!, funcStruct.dur!); + sp.scrollToActFunc(funcStruct, false); }; +} - jankClickHandler = (d: any) => { +function jankClickHandlerFunc(sp: SpSystemTrace) { + let jankClickHandler = (d: any) => { sp.observerScrollHeightEnable = true; let jankRowParent: any; if (d.rowId === 'actual frameTime') { @@ -225,56 +155,46 @@ export default function SpSystemTraceOnClickHandler(sp: SpSystemTrace, clickRowT jankRow = item; } }); - let task = () => { - if (jankRow) { - JankStruct.selectJankStructList.length = 0; - let findJankEntry = jankRow!.dataListCache!.find((dat: any) => dat.name == d.name && dat.pid == d.pid); - if (findJankEntry) { - if ( - findJankEntry!.ts! + findJankEntry!.dur! < TraceRow.range!.startNS || - findJankEntry!.ts! > TraceRow.range!.endNS - ) { - sp.timerShaftEL?.setRangeNS( - findJankEntry!.ts! - findJankEntry!.dur! * 2, - findJankEntry!.ts! + findJankEntry!.dur! + findJankEntry!.dur! * 2 - ); - } - sp.hoverStructNull(); - sp.selectStructNull(); - sp.wakeupListNull(); - JankStruct.hoverJankStruct = findJankEntry; - JankStruct.selectJankStruct = findJankEntry; - sp.timerShaftEL?.drawTriangle(findJankEntry!.ts || 0, 'inverted'); - sp.traceSheetEL?.displayJankData( - JankStruct.selectJankStruct!, - (datas) => { - sp.removeLinkLinesByBusinessType('janks'); - // 绘制跟自己关联的线 - datas.forEach((data) => { - let endParentRow = sp.shadowRoot?.querySelector>( - `trace-row[row-id='${data.pid}'][folder]` - ); - sp.drawJankLine(endParentRow, JankStruct.selectJankStruct!, data); - }); - }, - jankClickHandler + if (jankRow) { + JankStruct.selectJankStructList.length = 0; + let findJankEntry = jankRow!.dataListCache!.find((dat: any) => dat.name == d.name && dat.pid == d.pid); + if (findJankEntry) { + if (findJankEntry!.ts! + findJankEntry!.dur! < TraceRow.range!.startNS || + findJankEntry!.ts! > TraceRow.range!.endNS) { + sp.timerShaftEL?.setRangeNS( + findJankEntry!.ts! - findJankEntry!.dur! * 2, + findJankEntry!.ts! + findJankEntry!.dur! + findJankEntry!.dur! * 2 ); } - sp.scrollToProcess(jankRow.rowId!, jankRow.rowParentId!, jankRow.rowType!, true); + sp.hoverStructNull().selectStructNull().wakeupListNull(); + JankStruct.hoverJankStruct = findJankEntry; + JankStruct.selectJankStruct = findJankEntry; + sp.timerShaftEL?.drawTriangle(findJankEntry!.ts || 0, 'inverted'); + sp.traceSheetEL?.displayJankData(JankStruct.selectJankStruct!, (datas) => { + sp.removeLinkLinesByBusinessType('janks'); + // 绘制跟自己关联的线 + datas.forEach((data) => { + let endParentRow = sp.shadowRoot?.querySelector>( + `trace-row[row-id='${data.pid}'][folder]` + ); + sp.drawJankLine(endParentRow, JankStruct.selectJankStruct!, data); + }); + }, + jankClickHandler + ); } - }; - task(); - }; - - scrollToFuncHandler = (funcStract: any) => { - sp.observerScrollHeightEnable = true; - sp.moveRangeToCenter(funcStract.startTs!, funcStract.dur!); - sp.scrollToActFunc(funcStract, false); + sp.scrollToProcess(jankRow.rowId!, jankRow.rowParentId!, jankRow.rowType!, true); + } }; + return jankClickHandler; +} - snapshotClickHandler = (d: HeapSnapshotStruct) => { +function snapshotClickHandlerFunc(sp: SpSystemTrace) { + let snapshotClickHandler = (d: HeapSnapshotStruct) => { sp.observerScrollHeightEnable = true; - let snapshotRow = sp.shadowRoot?.querySelector>(`trace-row[row-id='heapsnapshot']`); + let snapshotRow = sp.shadowRoot?.querySelector>( + `trace-row[row-id='heapsnapshot']` + ); let task = () => { if (snapshotRow) { let findEntry = snapshotRow!.dataListCache!.find((dat) => dat.startTs === d.startTs); @@ -293,292 +213,117 @@ export default function SpSystemTraceOnClickHandler(sp: SpSystemTrace, clickRowT } } }; - if (clickRowType === TraceRow.ROW_TYPE_CPU && CpuStruct.hoverCpuStruct) { - CpuStruct.selectCpuStruct = CpuStruct.hoverCpuStruct; - sp.timerShaftEL?.drawTriangle(CpuStruct.selectCpuStruct!.startTime || 0, 'inverted'); - sp.traceSheetEL?.displayCpuData( - CpuStruct.selectCpuStruct, - (wakeUpBean) => { - CpuStruct.wakeupBean = wakeUpBean; - sp.refreshCanvas(false); - }, - cpuClickHandler - ); - sp.timerShaftEL?.modifyFlagList(undefined); - } else if (clickRowType === TraceRow.ROW_TYPE_THREAD && ThreadStruct.hoverThreadStruct) { - sp.removeLinkLinesByBusinessType('thread'); - ThreadStruct.selectThreadStruct = ThreadStruct.hoverThreadStruct; - sp.timerShaftEL?.drawTriangle(ThreadStruct.selectThreadStruct!.startTime || 0, 'inverted'); - sp.traceSheetEL?.displayThreadData(ThreadStruct.selectThreadStruct, threadClickHandler, cpuClickHandler); - sp.timerShaftEL?.modifyFlagList(undefined); - } else if (clickRowType === TraceRow.ROW_TYPE_FUNC && FuncStruct.hoverFuncStruct) { - TabPaneTaskFrames.TaskArray = []; - sp.removeLinkLinesByBusinessType('task'); - FuncStruct.selectFuncStruct = FuncStruct.hoverFuncStruct; - let hoverFuncStruct = FuncStruct.hoverFuncStruct; - sp.timerShaftEL?.drawTriangle(FuncStruct.selectFuncStruct!.startTs || 0, 'inverted'); - FuncStruct.selectFuncStruct = hoverFuncStruct; - let flagConfig = FlagsConfig.getFlagsConfig('TaskPool'); - let showTabArray: Array = ['current-selection']; - if (flagConfig!.TaskPool === 'Enabled') { - if (FuncStruct.selectFuncStruct?.funName) { - if (FuncStruct.selectFuncStruct.funName.indexOf('H:Task ') >= 0) { - showTabArray.push('box-task-frames'); - sp.drawTaskPollLine(row); - } - } + return snapshotClickHandler; +} + +function cpuClickHandlerTask(threadRow: TraceRow, sp: SpSystemTrace, d: CpuStruct) { + if (threadRow) { + let findEntry = threadRow!.fixedList[0]; + if ( + findEntry!.startTime! + findEntry!.dur! < TraceRow.range!.startNS || + findEntry!.startTime! > TraceRow.range!.endNS + ) { + sp.timerShaftEL?.setRangeNS( + findEntry!.startTime! - findEntry!.dur! * 2, + findEntry!.startTime! + findEntry!.dur! + findEntry!.dur! * 2 + ); } - sp.traceSheetEL?.displayFuncData(showTabArray, FuncStruct.selectFuncStruct, scrollToFuncHandler); - sp.timerShaftEL?.modifyFlagList(undefined); - } else if (clickRowType === TraceRow.ROW_TYPE_CPU_FREQ && CpuFreqStruct.hoverCpuFreqStruct) { - CpuFreqStruct.selectCpuFreqStruct = CpuFreqStruct.hoverCpuFreqStruct; - sp.traceSheetEL?.displayFreqData(); - sp.timerShaftEL?.modifyFlagList(undefined); - } else if (clickRowType === TraceRow.ROW_TYPE_CPU_STATE && CpuStateStruct.hoverStateStruct) { - CpuStateStruct.selectStateStruct = CpuStateStruct.hoverStateStruct; - sp.traceSheetEL?.displayCpuStateData(); - sp.timerShaftEL?.modifyFlagList(undefined); - } else if (clickRowType === TraceRow.ROW_TYPE_CPU_FREQ_LIMIT && CpuFreqLimitsStruct.hoverCpuFreqLimitsStruct) { - CpuFreqLimitsStruct.selectCpuFreqLimitsStruct = CpuFreqLimitsStruct.hoverCpuFreqLimitsStruct; - sp.traceSheetEL?.displayFreqLimitData(); - sp.timerShaftEL?.modifyFlagList(undefined); - } else if (clickRowType === TraceRow.ROW_TYPE_CLOCK && ClockStruct.hoverClockStruct) { - ClockStruct.selectClockStruct = ClockStruct.hoverClockStruct; - sp.traceSheetEL?.displayClockData(ClockStruct.selectClockStruct); - sp.timerShaftEL?.modifyFlagList(undefined); - } else if (clickRowType === TraceRow.ROW_TYPE_SYS_MEMORY_GPU_TOTAL && SnapshotStruct.hoverSnapshotStruct) { - let gpuDumpTotalRow = sp.shadowRoot?.querySelector>( - `trace-row[row-id='Skia Gpu Dump Total']` - ); - SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; - sp.traceSheetEL?.displayGpuSelectedData( - 'total', - SnapshotStruct.selectSnapshotStruct.startNs, - gpuDumpTotalRow!.dataListCache - ); - sp.timerShaftEL?.modifyFlagList(undefined); - } else if (clickRowType === TraceRow.ROW_TYPE_SYS_MEMORY_GPU_WINDOW && SnapshotStruct.hoverSnapshotStruct) { - let gpuDumpWindowRow = sp.shadowRoot?.querySelector>( - `trace-row[row-id='Skia Gpu Dump Window']` + sp.hoverStructNull().selectStructNull().wakeupListNull(); + ThreadStruct.hoverThreadStruct = findEntry; + ThreadStruct.selectThreadStruct = findEntry; + sp.timerShaftEL?.drawTriangle(findEntry!.startTime || 0, 'inverted'); + sp.traceSheetEL?.displayThreadData( + ThreadStruct.selectThreadStruct!, + threadClickHandlerFunc(sp), + cpuClickHandlerFunc(sp), + (datas) => sp.removeLinkLinesByBusinessType('thread') ); - SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; - sp.traceSheetEL?.displayGpuSelectedData( - 'window', - SnapshotStruct.selectSnapshotStruct.startNs, - gpuDumpWindowRow!.dataListCache + sp.scrollToProcess(`${d.tid}`, `${d.processId}`, 'thread', true); + } +} + +function cpuClickHandlerFunc(sp: SpSystemTrace) { + return function (d: CpuStruct) { + let traceRow = sp.shadowRoot?.querySelector>( + `trace-row[row-id='${d.processId}'][row-type='process']` ); - sp.timerShaftEL?.modifyFlagList(undefined); - } else if (clickRowType === TraceRow.ROW_TYPE_IRQ && IrqStruct.hoverIrqStruct) { - IrqStruct.selectIrqStruct = IrqStruct.hoverIrqStruct; - sp.traceSheetEL?.displayIrqData(IrqStruct.selectIrqStruct); - sp.timerShaftEL?.modifyFlagList(undefined); - } else if ( - clickRowType === TraceRow.ROW_TYPE_HEAP && - row && - row.getAttribute('heap-type') === 'native_hook_statistic' && - HeapStruct.hoverHeapStruct - ) { - HeapStruct.selectHeapStruct = HeapStruct.hoverHeapStruct; - const key = row.rowParentId!.split(' '); - let ipid = 1; - if (key.length > 0) { - ipid = Number(key[key.length - 1]); + if (traceRow) { + traceRow.expansion = true; } - sp.traceSheetEL?.displayNativeHookData(HeapStruct.selectHeapStruct, row.rowId!, ipid); - sp.timerShaftEL?.modifyFlagList(undefined); - } else if (clickRowType === TraceRow.ROW_TYPE_JANK && JankStruct.hoverJankStruct) { - JankStruct.selectJankStructList.length = 0; - sp.removeLinkLinesByBusinessType('janks'); - JankStruct.selectJankStruct = JankStruct.hoverJankStruct; - sp.timerShaftEL?.drawTriangle(JankStruct.selectJankStruct!.ts || 0, 'inverted'); - sp.traceSheetEL?.displayJankData( - JankStruct.selectJankStruct, - (datas) => { - datas.forEach((data) => { - let endParentRow; - if (data.frame_type == 'frameTime') { - endParentRow = sp.shadowRoot?.querySelector>( - `trace-row[row-id='frameTime'][row-type='janks']` - ); - } else { - endParentRow = sp.shadowRoot?.querySelector>(`trace-row[row-id='${data.pid}'][folder]`); - } - sp.drawJankLine(endParentRow, JankStruct.selectJankStruct!, data); - }); - }, - jankClickHandler - ); - } else if (clickRowType === TraceRow.ROW_TYPE_HEAP_SNAPSHOT && HeapSnapshotStruct.hoverSnapshotStruct) { - let snapshotRow = sp.shadowRoot?.querySelector>(`trace-row[row-id='heapsnapshot']`); - HeapSnapshotStruct.selectSnapshotStruct = HeapSnapshotStruct.hoverSnapshotStruct; - sp.traceSheetEL?.displaySnapshotData( - HeapSnapshotStruct.selectSnapshotStruct!, - snapshotRow!.dataListCache, - snapshotClickHandler - ); - } else if (clickRowType === TraceRow.ROW_TYPE_JS_CPU_PROFILER && JsCpuProfilerStruct.hoverJsCpuProfilerStruct) { - JsCpuProfilerStruct.selectJsCpuProfilerStruct = JsCpuProfilerStruct.hoverJsCpuProfilerStruct; - let selectStruct = JsCpuProfilerStruct.selectJsCpuProfilerStruct; - let dataArr: Array = []; - let parentIdArr: Array = []; - let that = sp; - getTopJsCpuProfilerStruct(selectStruct.parentId); - - function getTopJsCpuProfilerStruct(parentId: number) { - if (parentId === -1 && selectStruct.parentId === -1) { - // 点击的函数是第一层,直接设置其children的isSelect为true,不用重新算totalTime - let data = that.chartManager!.arkTsChart.chartFrameMap.get(selectStruct!.id); - if (data && dataArr.length === 0) { - let copyData = JSON.parse(JSON.stringify(data)); - setSelectChildrenState(copyData); - dataArr.push(copyData); - } + sp.observerScrollHeightEnable = true; + let threadRow = sp.queryAllTraceRow>( + `trace-row[row-id='${d.tid}'][row-type='thread']`, + (row) => row.rowId === `${d.tid}` && row.rowType === 'thread' + )[0]; + if (threadRow) { + threadRow.fixedList = [ + { + startTime: d.startTime, + dur: d.dur, + cpu: d.cpu, + id: d.id, + tid: d.tid, + state: d.state, + pid: d.processId, + argSetID: d.argSetID, + }, + ]; + if (threadRow!.isComplete) { + cpuClickHandlerTask(threadRow, sp, d); } else { - let parent = that.chartManager!.arkTsChart.chartFrameMap.get(parentId); - if (parent) { - parentIdArr.push(parent.id); - getTopJsCpuProfilerStruct(parent.parentId!); - if (parent.parentId === -1 && dataArr.length === 0) { - let data = that.chartManager!.arkTsChart.chartFrameMap.get(parent.id); - let copyParent = JSON.parse(JSON.stringify(data)); - copyParent.totalTime = selectStruct.totalTime; - copyParent.selfTime = 0; - // depth为0的isSelect改为true - copyParent.isSelect = true; - if (copyParent.children.length > 0) { - getSelectStruct(copyParent); - } - dataArr.push(copyParent); - } - } + sp.scrollToProcess(`${d.tid}`, `${d.processId}`, 'process', false); + sp.scrollToProcess(`${d.tid}`, `${d.processId}`, 'thread', true); + threadRow!.onComplete = () => cpuClickHandlerTask(threadRow, sp, d); } } + }; +} - function getSelectStruct(data: JsCpuProfilerChartFrame) { - for (let child of data.children) { - if (child === null) { - continue; - } - if (child.id === selectStruct!.id) { - // 将点击的函数的children的isSelect改为true - setSelectChildrenState(child); - } else { - getSelectStruct(child); - } - if (parentIdArr.includes(child.id)) { - child.isSelect = true; - child.totalTime = selectStruct.totalTime; - child.selfTime = 0; - } +function AllStructOnClick(clickRowType:string,sp:SpSystemTrace,row?:TraceRow) { + CpuStructOnClick(clickRowType, sp, cpuClickHandlerFunc(sp)) + .then(() => ThreadStructOnClick(clickRowType, sp, threadClickHandlerFunc(sp), cpuClickHandlerFunc(sp))) + .then(() => FuncStructOnClick(clickRowType, sp, row, scrollToFuncHandlerFunc(sp))) + .then(() => CpuFreqStructOnClick(clickRowType, sp)) + .then(() => CpuStateStructOnClick(clickRowType, sp)) + .then(() => CpuFreqLimitsStructOnClick(clickRowType, sp)) + .then(() => ClockStructOnClick(clickRowType, sp)) + .then(() => SnapshotStructOnClick(clickRowType, sp)) + .then(() => IrqStructOnClick(clickRowType, sp)) + .then(() => HeapStructOnClick(clickRowType, sp, row)) + .then(() => JankStructOnClick(clickRowType, sp, jankClickHandlerFunc(sp))) + .then(() => HeapSnapshotStructOnClick(clickRowType, sp, snapshotClickHandlerFunc(sp))) + .then(() => JsCpuProfilerStructOnClick(clickRowType, sp)) + .then(() => AppStartupStructOnClick(clickRowType, sp, scrollToFuncHandlerFunc(sp))) + .then(() => SoStructOnClick(clickRowType, sp, scrollToFuncHandlerFunc(sp))) + .then(() => FrameAnimationStructOnClick(clickRowType, sp)) + .then(() => FrameDynamicStructOnClick(clickRowType, sp, row)) + .then(() => FrameSpacingStructOnClick(clickRowType, sp)) + .then(() => { + if (!JankStruct.hoverJankStruct && JankStruct.delJankLineFlag) { + sp.removeLinkLinesByBusinessType('janks'); } - } - - function setSelectChildrenState(data: JsCpuProfilerChartFrame) { - data.isSelect = true; - if (data.children.length > 0) { - for (let child of data.children) { - if (child === null) { - continue; - } - setSelectChildrenState(child); - } + sp.observerScrollHeightEnable = false; + sp.selectFlag = null; + sp.timerShaftEL?.removeTriangle('inverted'); + if (!SportRuler.isMouseInSportRuler) { + sp.traceSheetEL?.setAttribute('mode', 'hidden'); + sp.refreshCanvas(true); } - } - - that.traceSheetEL?.displayJsProfilerData(dataArr); - } else if (clickRowType === TraceRow.ROW_TYPE_APP_STARTUP && AppStartupStruct.hoverStartupStruct) { - AppStartupStruct.selectStartupStruct = AppStartupStruct.hoverStartupStruct; - sp.traceSheetEL?.displayStartupData(AppStartupStruct.selectStartupStruct, scrollToFuncHandler); - sp.timerShaftEL?.modifyFlagList(undefined); - } else if (clickRowType === TraceRow.ROW_TYPE_ALL_APPSTARTUPS && AllAppStartupStruct.hoverStartupStruct) { - AllAppStartupStruct.selectStartupStruct = AllAppStartupStruct.hoverStartupStruct; - sp.traceSheetEL?.displayAllStartupData(AllAppStartupStruct.selectStartupStruct!, scrollToFuncHandler); - sp.timerShaftEL?.modifyFlagList(undefined); - } else if (clickRowType === TraceRow.ROW_TYPE_STATIC_INIT && SoStruct.hoverSoStruct) { - SoStruct.selectSoStruct = SoStruct.hoverSoStruct; - sp.traceSheetEL?.displayStaticInitData(SoStruct.selectSoStruct, scrollToFuncHandler); - sp.timerShaftEL?.modifyFlagList(undefined); - } else if (clickRowType === TraceRow.ROW_TYPE_FRAME_ANIMATION && FrameAnimationStruct.hoverFrameAnimationStruct) { - FrameAnimationStruct.selectFrameAnimationStruct = FrameAnimationStruct.hoverFrameAnimationStruct; - sp.traceSheetEL?.displayFrameAnimationData(FrameAnimationStruct.selectFrameAnimationStruct); - sp.timerShaftEL?.modifyFlagList(undefined); - } else if (clickRowType === TraceRow.ROW_TYPE_FRAME_DYNAMIC && FrameDynamicStruct.hoverFrameDynamicStruct) { - FrameDynamicStruct.selectFrameDynamicStruct = FrameDynamicStruct.hoverFrameDynamicStruct; - sp.traceSheetEL?.displayFrameDynamicData(row!, FrameDynamicStruct.selectFrameDynamicStruct); - sp.timerShaftEL?.modifyFlagList(undefined); - } else if (clickRowType === TraceRow.ROW_TYPE_FRAME_SPACING && FrameSpacingStruct.hoverFrameSpacingStruct) { - FrameSpacingStruct.selectFrameSpacingStruct = FrameSpacingStruct.hoverFrameSpacingStruct; - sp.traceSheetEL?.displayFrameSpacingData(FrameSpacingStruct.selectFrameSpacingStruct); - sp.timerShaftEL?.modifyFlagList(undefined); - } else if (clickRowType === TraceRow.ROW_TYPE_VM_TRACKER_SMAPS && SnapshotStruct.hoverSnapshotStruct) { - let smapsRow = sp.shadowRoot?.querySelector>(`trace-row[row-id='Dirty']`); - SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; - sp.traceSheetEL?.displaySmapsData(SnapshotStruct.selectSnapshotStruct!, smapsRow!.dataListCache); - } else if (clickRowType === TraceRow.ROW_TYPE_VMTRACKER_SHM && SnapshotStruct.hoverSnapshotStruct) { - let shmRow = sp.shadowRoot?.querySelector>(`trace-row[row-id='SHM']`); - SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; - sp.traceSheetEL?.displayShmData(SnapshotStruct.selectSnapshotStruct!, shmRow!.dataListCache); - } else if (clickRowType === TraceRow.ROW_TYPE_PURGEABLE_TOTAL_ABILITY && SnapshotStruct.hoverSnapshotStruct) { - let totalAbilityRow = sp.shadowRoot?.querySelector>( - `trace-row[row-id='System Purgeable Total']` - ); - SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; - sp.traceSheetEL?.displayPurgTotalAbilityData(SnapshotStruct.hoverSnapshotStruct, totalAbilityRow!.dataListCache); - } else if (clickRowType === TraceRow.ROW_TYPE_PURGEABLE_PIN_ABILITY && SnapshotStruct.hoverSnapshotStruct) { - let pinAbilityRow = sp.shadowRoot?.querySelector>( - `trace-row[row-id='System Purgeable Pin']` - ); - SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; - sp.traceSheetEL?.displayPurgPinAbilityData(SnapshotStruct.hoverSnapshotStruct, pinAbilityRow!.dataListCache); - } else if (clickRowType === TraceRow.ROW_TYPE_PURGEABLE_TOTAL_VM && SnapshotStruct.hoverSnapshotStruct) { - let totalVMRow = sp.shadowRoot?.querySelector>(`trace-row[row-id='Purgeable Total']`); - SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; - sp.traceSheetEL?.displayPurgTotalVMData(SnapshotStruct.hoverSnapshotStruct, totalVMRow!.dataListCache); - } else if (clickRowType === TraceRow.ROW_TYPE_PURGEABLE_PIN_VM && SnapshotStruct.hoverSnapshotStruct) { - let pinVMRow = sp.shadowRoot?.querySelector>(`trace-row[row-id='Purgeable Pin']`); - SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; - sp.traceSheetEL?.displayPurgPinVMData(SnapshotStruct.hoverSnapshotStruct, pinVMRow!.dataListCache); - } else if (clickRowType === TraceRow.ROW_TYPE_DMA_ABILITY && SnapshotStruct.hoverSnapshotStruct) { - let dmaAbilityRow = sp.shadowRoot?.querySelector>(`trace-row[row-id='abilityMonitorDma']`); - SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; - sp.traceSheetEL?.displayDmaAbility(SnapshotStruct.selectSnapshotStruct.startNs, dmaAbilityRow!.dataListCache); - } else if (clickRowType === TraceRow.ROW_TYPE_DMA_VMTRACKER && SnapshotStruct.hoverSnapshotStruct) { - let dmaVmTracker = sp.shadowRoot?.querySelector>(`trace-row[row-type='dma-vmTracker']`); - SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; - sp.traceSheetEL?.displayDmaVmTracker(SnapshotStruct.selectSnapshotStruct.startNs, dmaVmTracker!.dataListCache); - } else if (clickRowType === TraceRow.ROW_TYPE_GPU_MEMORY_ABILITY && SnapshotStruct.hoverSnapshotStruct) { - let gpuMemoryAbilityMonitor = sp.shadowRoot?.querySelector>( - `trace-row[row-id='abilityMonitorGpuMemory']` - ); - SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; - sp.traceSheetEL?.displayGpuMemoryAbility( - SnapshotStruct.selectSnapshotStruct.startNs, - gpuMemoryAbilityMonitor!.dataListCache - ); - } else if (clickRowType === TraceRow.ROW_TYPE_GPU_MEMORY_VMTRACKER && SnapshotStruct.hoverSnapshotStruct) { - let gpuMemoryVmTracker = sp.shadowRoot?.querySelector>( - `trace-row[row-id='Skia Gpu Memory']` - ); - SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; - sp.traceSheetEL?.displayGpuMemoryVmTracker( - SnapshotStruct.selectSnapshotStruct.startNs, - gpuMemoryVmTracker!.dataListCache - ); - } else if (clickRowType === TraceRow.ROW_TYPE_GPU_RESOURCE_VMTRACKER && SnapshotStruct.hoverSnapshotStruct) { - SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; - sp.traceSheetEL?.displayGpuResourceVmTracker(SnapshotStruct.selectSnapshotStruct.startNs); - } else { - if (!JankStruct.hoverJankStruct && JankStruct.delJankLineFlag) { - sp.removeLinkLinesByBusinessType('janks'); - } - sp.observerScrollHeightEnable = false; - sp.selectFlag = null; - sp.timerShaftEL?.removeTriangle('inverted'); - if (!SportRuler.isMouseInSportRuler) { - sp.traceSheetEL?.setAttribute('mode', 'hidden'); - sp.refreshCanvas(true); - } + }); +} +export default function SpSystemTraceOnClickHandler(sp: SpSystemTrace, clickRowType: string, row?: TraceRow) { + if (row) { + sp.currentRow = row; + sp.setAttribute('clickRow', clickRowType); + sp.setAttribute('rowName', row.name!); + sp.setAttribute('rowId', row.rowId!); } + if (!sp.loadTraceCompleted) return; + sp.queryAllTraceRow().forEach((it) => (it.rangeSelect = false)); + sp.selectStructNull(); + // 判断点击的线程是否在唤醒树内 + timeoutJudge(sp); + AllStructOnClick(clickRowType,sp,row); if (!JankStruct.selectJankStruct) { sp.removeLinkLinesByBusinessType('janks'); } @@ -593,6 +338,7 @@ export default function SpSystemTraceOnClickHandler(sp: SpSystemTrace, clickRowT }); } } + export function SpSystemTraceDocumentOnMouseMove(sp: SpSystemTrace, ev: MouseEvent) { if (!sp.loadTraceCompleted || (window as any).flagInputFocus || !sp.mouseEventEnable) { return; @@ -636,41 +382,49 @@ export function SpSystemTraceDocumentOnMouseMove(sp: SpSystemTrace, ev: MouseEve } let search = document.querySelector('body > sp-application')!.shadowRoot!.querySelector('#lit-search'); if (sp.rangeSelect.isMouseDown && search?.isClearValue) { - sp.refreshCanvas(true); - if (TraceRow.rangeSelectObject) { - if (search && search.searchValue !== '') { - search.clear(); - search.valueChangeHandler?.(''); - } - } + SpSystemTraceDocumentOnMouseMoveMouseDown(sp, search); } else { - if (!sp.rowsPaneEL!.containPoint(ev, { left: 248 })) { - sp.hoverStructNull(); + SpSystemTraceDocumentOnMouseMoveMouseUp(sp, rows, ev); + } +} + +function SpSystemTraceDocumentOnMouseMoveMouseDown(sp: SpSystemTrace, search: LitSearch) { + sp.refreshCanvas(true); + if (TraceRow.rangeSelectObject) { + if (search && search.searchValue !== '') { + search.clear(); + search.valueChangeHandler?.(''); } - rows - .filter((it) => it.focusContain(ev, sp.inFavoriteArea!) && it.collect === sp.inFavoriteArea) - .filter((it) => { - if (it.collect) { - return true; - } else { - return ( - it.getBoundingClientRect().bottom + it.getBoundingClientRect().height > - sp.favoriteChartListEL!.getBoundingClientRect().bottom - ); - } - }) - .forEach((tr) => { - sp.hoverStructNull(); - if (sp.currentRowType != tr.rowType) { - sp.currentRowType = tr.rowType || ''; - } - tr.findHoverStruct?.(); - tr.focusHandler?.(ev); - }); - requestAnimationFrame(() => sp.refreshCanvas(true)); } } +function SpSystemTraceDocumentOnMouseMoveMouseUp(sp: SpSystemTrace, rows: Array>, ev: MouseEvent) { + if (!sp.rowsPaneEL!.containPoint(ev, {left: 248})) { + sp.hoverStructNull(); + } + rows + .filter((it) => it.focusContain(ev, sp.inFavoriteArea!) && it.collect === sp.inFavoriteArea) + .filter((it) => { + if (it.collect) { + return true; + } else { + return ( + it.getBoundingClientRect().bottom + it.getBoundingClientRect().height > + sp.favoriteChartListEL!.getBoundingClientRect().bottom + ); + } + }) + .forEach((tr) => { + sp.hoverStructNull(); + if (sp.currentRowType != tr.rowType) { + sp.currentRowType = tr.rowType || ''; + } + tr.findHoverStruct?.(); + tr.focusHandler?.(ev); + }); + requestAnimationFrame(() => sp.refreshCanvas(true)); +} + export function SpSystemTraceDocumentOnMouseOut(sp: SpSystemTrace, ev: MouseEvent) { if (!sp.loadTraceCompleted) { return; @@ -810,17 +564,15 @@ export function SpSystemTraceDocumentOnMouseUp(sp: SpSystemTrace, ev: MouseEvent if (ev.offsetX > sp.timerShaftEL!.canvas!.offsetLeft) { let x = ev.offsetX - sp.timerShaftEL!.canvas!.offsetLeft; let y = ev.offsetY; - if ( - sp.timerShaftEL!.sportRuler!.frame.contains(x, y) && + if (sp.timerShaftEL!.sportRuler!.frame.contains(x, y) && x > (TraceRow.rangeSelectObject?.startX || 0) && - x < (TraceRow.rangeSelectObject?.endX || 0) - ) { + x < (TraceRow.rangeSelectObject?.endX || 0)) { let findSlicestime = sp.timerShaftEL!.sportRuler?.findSlicesTime(x, y); // 查找帽子 if (!findSlicestime) { // 如果没有找到帽子,则绘制一个旗子 let time = Math.round( (x * (TraceRow.range?.endNS! - TraceRow.range?.startNS!)) / sp.timerShaftEL!.canvas!.offsetWidth + - TraceRow.range?.startNS! + TraceRow.range?.startNS! ); sp.timerShaftEL!.sportRuler!.drawTriangle(time, 'squre'); } @@ -839,8 +591,7 @@ export function SpSystemTraceDocumentOnKeyUp(sp: SpSystemTrace, ev: KeyboardEven } } if (ev.key.toLocaleLowerCase() === '?') { - document - .querySelector('body > sp-application')! + document.querySelector('body > sp-application')! .shadowRoot!.querySelector('#sp-keyboard')!.style.visibility = 'visible'; } if (!sp.loadTraceCompleted) return; @@ -871,19 +622,22 @@ export function SpSystemTraceDocumentOnKeyUp(sp: SpSystemTrace, ev: KeyboardEven } document.addEventListener('keydown', sp.documentOnKeyDown); } - if (ev.ctrlKey) { - if (keyPress === '[' && sp._slicesList.length > 1) { - sp.MarkJump(sp._slicesList, 'slice', 'previous'); - } else if (keyPress === ',' && sp._flagList.length > 1) { - sp.MarkJump(sp._flagList, 'flag', 'previous'); - } else if (keyPress === ']' && sp._slicesList.length > 1) { - sp.MarkJump(sp._slicesList, 'slice', 'next'); - } else if (keyPress === '.' && sp._flagList.length > 1) { - sp.MarkJump(sp._flagList, 'flag', 'next'); - } else { - return; - } + SpSystemTraceDocumentOnKeyUpCtrlKey(keyPress, sp); + } +} + +function SpSystemTraceDocumentOnKeyUpCtrlKey(keyPress: string, sp: SpSystemTrace) { + if (keyPress === '[' && sp._slicesList.length > 1) { + sp.MarkJump(sp._slicesList, 'slice', 'previous'); + } else if (keyPress === ',' && sp._flagList.length > 1) { + sp.MarkJump(sp._flagList, 'flag', 'previous'); + } else if (keyPress === ']' && sp._slicesList.length > 1) { + sp.MarkJump(sp._slicesList, 'slice', 'next'); + } else if (keyPress === '.' && sp._flagList.length > 1) { + sp.MarkJump(sp._flagList, 'flag', 'next'); + } else { + return; } } @@ -917,11 +671,9 @@ export function SpSystemTraceDocumentOnClick(sp: SpSystemTrace, ev: MouseEvent) return; } if ( - !( - sp.timerShaftEL!.sportRuler!.frame.contains(x, y) && + !(sp.timerShaftEL!.sportRuler!.frame.contains(x, y) && x > (TraceRow.rangeSelectObject?.startX || 0) && - x < (TraceRow.rangeSelectObject?.endX || 0) - ) + x < (TraceRow.rangeSelectObject?.endX || 0)) ) { let inFavoriteArea = sp.favoriteChartListEL?.containPoint(ev); let rows = sp.visibleRows.filter((it) => it.focusContain(ev, inFavoriteArea!) && it.collect === inFavoriteArea); diff --git a/ide/src/trace/component/SpSystemTrace.init.ts b/ide/src/trace/component/SpSystemTrace.init.ts index ba3d9306..f951dc74 100644 --- a/ide/src/trace/component/SpSystemTrace.init.ts +++ b/ide/src/trace/component/SpSystemTrace.init.ts @@ -13,1315 +13,776 @@ * limitations under the License. */ -import { SpSystemTrace } from './SpSystemTrace'; -import { TabPaneFrequencySample } from './trace/sheet/cpu/TabPaneFrequencySample'; -import { TabPaneCounterSample } from './trace/sheet/cpu/TabPaneCounterSample'; -import { RangeSelect } from './trace/base/RangeSelect'; -import { RangeSelectStruct, TraceRow } from './trace/base/TraceRow'; -import { SportRuler } from './trace/timer-shaft/SportRuler'; -import { SelectionParam } from '../bean/BoxSelection'; -import { error, info } from '../../log/Log'; -import { intersectData, isExistPidInArray, setSelectState } from './Utils'; -import { TabPaneTaskFrames } from './trace/sheet/task/TabPaneTaskFrames'; -import { FuncStruct } from '../database/ui-worker/ProcedureWorkerFunc'; -import { JanksStruct } from '../bean/JanksStruct'; -import { HeapDataInterface } from '../../js-heap/HeapDataInterface'; -import { LitTabs } from '../../base-ui/tabs/lit-tabs'; -import { TabPaneSummary } from './trace/sheet/ark-ts/TabPaneSummary'; -import { JsCpuProfilerStruct } from '../database/ui-worker/ProcedureWorkerCpuProfiler'; -import { FrameAnimationStruct } from '../database/ui-worker/ProcedureWorkerFrameAnimation'; -import { FrameDynamicStruct } from '../database/ui-worker/ProcedureWorkerFrameDynamic'; -import { FrameSpacingStruct } from '../database/ui-worker/ProcedureWorkerFrameSpacing'; -import { SpStatisticsHttpUtil } from '../../statistics/util/SpStatisticsHttpUtil'; -import { queryEbpfSamplesCount } from '../database/sql/Memory.sql'; -import { SpChartManager } from './chart/SpChartManager'; -import { ThreadStruct } from '../database/ui-worker/ProcedureWorkerThread'; -import { FlagsConfig } from './SpFlags'; -import { threadPool } from '../database/SqlLite'; -import { JankStruct } from '../database/ui-worker/ProcedureWorkerJank'; -import { CpuStruct } from '../database/ui-worker/cpu/ProcedureWorkerCPU'; +import {SpSystemTrace} from './SpSystemTrace'; +import { TabPaneFrequencySample } from "./trace/sheet/cpu/TabPaneFrequencySample"; +import { TabPaneCounterSample } from "./trace/sheet/cpu/TabPaneCounterSample"; +import { RangeSelect } from "./trace/base/RangeSelect"; +import { TraceRow } from "./trace/base/TraceRow"; +import { SportRuler } from "./trace/timer-shaft/SportRuler"; +import { SelectionParam } from "../bean/BoxSelection"; +import {error, info} from "../../log/Log"; +import { SpStatisticsHttpUtil } from "../../statistics/util/SpStatisticsHttpUtil"; +import { queryEbpfSamplesCount } from "../database/sql/Memory.sql"; +import { SpChartManager } from "./chart/SpChartManager"; +import {ThreadStruct} from "../database/ui-worker/ProcedureWorkerThread"; +import {FlagsConfig} from "./SpFlags"; +import {threadPool} from "../database/SqlLite"; +import {JankStruct} from "../database/ui-worker/ProcedureWorkerJank"; +import {CpuStruct} from "../database/ui-worker/cpu/ProcedureWorkerCPU"; +import {PairPoint} from "../database/ui-worker/ProcedureWorkerCommon"; +type HTMLElementAlias = HTMLElement | null | undefined; -export function SpSystemTraceInitElement(sp: SpSystemTrace) { - window.subscribe(window.SmartEvent.UI.LoadFinishFrame, () => sp.drawAllLines()); - sp.traceSheetEL = sp.shadowRoot?.querySelector('.trace-sheet'); - let rightButton: HTMLElement | null | undefined = sp.traceSheetEL?.shadowRoot - ?.querySelector('#current-selection > tabpane-current-selection') - ?.shadowRoot?.querySelector('#rightButton'); - let rightStar: HTMLElement | null | undefined = sp.traceSheetEL?.shadowRoot - ?.querySelector('#current-selection > tabpane-current-selection') - ?.shadowRoot?.querySelector('#right-star'); - sp.tipEL = sp.shadowRoot?.querySelector('.tip'); - sp.rowsPaneEL = sp.shadowRoot?.querySelector('.rows-pane'); - sp.rowsEL = sp.rowsPaneEL; - sp.spacerEL = sp.shadowRoot?.querySelector('.spacer'); - sp.timerShaftEL = sp.shadowRoot?.querySelector('.timer-shaft'); - sp.favoriteChartListEL = sp.shadowRoot?.querySelector('#favorite-chart-list'); - sp.tabCpuFreq = sp.traceSheetEL?.shadowRoot?.querySelector('tabpane-frequency-sample'); - sp.tabCpuState = sp.traceSheetEL?.shadowRoot?.querySelector('tabpane-counter-sample'); - sp.rangeSelect = new RangeSelect(sp); - rightButton?.addEventListener('click', (event: any) => { - if (SpSystemTrace.btnTimer) { - return; - } - // 唤醒树有值则不再重复添加 - const startIndex = CpuStruct.selectCpuStruct!.displayProcess?.indexOf('['); - if (SpSystemTrace.wakeupList.length === 0) { - SpSystemTrace.wakeupList.unshift(CpuStruct.wakeupBean!); - sp.queryCPUWakeUpList(CpuStruct.wakeupBean!); - CpuStruct.selectCpuStruct!.ts = CpuStruct.selectCpuStruct!.startTime; - CpuStruct.selectCpuStruct!.thread = CpuStruct.selectCpuStruct!.name; - CpuStruct.selectCpuStruct!.pid = CpuStruct.selectCpuStruct!.processId; - CpuStruct.selectCpuStruct!.process = CpuStruct.selectCpuStruct!.displayProcess?.substring(0, startIndex).trim(); - CpuStruct.selectCpuStruct!.itid = CpuStruct.wakeupBean!.itid; - sessionStorage.setItem('saveselectcpustruct', JSON.stringify(CpuStruct.selectCpuStruct)); - } else { - sp.wakeupListNull(); - SpSystemTrace.wakeupList.unshift(CpuStruct.wakeupBean!); - sp.queryCPUWakeUpList(CpuStruct.wakeupBean!); - CpuStruct.selectCpuStruct!.ts = CpuStruct.selectCpuStruct!.startTime; - CpuStruct.selectCpuStruct!.thread = CpuStruct.selectCpuStruct!.name; - CpuStruct.selectCpuStruct!.pid = CpuStruct.selectCpuStruct!.processId; - CpuStruct.selectCpuStruct!.process = CpuStruct.selectCpuStruct!.displayProcess?.substring(0, startIndex).trim(); - CpuStruct.selectCpuStruct!.itid = CpuStruct.wakeupBean!.itid; - sessionStorage.setItem('saveselectcpustruct', JSON.stringify(CpuStruct.selectCpuStruct)); - } - setTimeout(() => { - requestAnimationFrame(() => sp.refreshCanvas(false)); - }, 300); - rightStar!.style.visibility = 'visible'; - rightStar!.style.cursor = 'pointer'; - SpSystemTrace.btnTimer = setTimeout(() => { - SpSystemTrace.btnTimer = null; // 2.清空节流阀,方便下次开启定时器 - }, 2000); - }); - rightStar?.addEventListener('click', () => { - let wakeupLists = []; - wakeupLists.push(CpuStruct.selectCpuStruct?.cpu); - for (let wakeupBean of SpSystemTrace.wakeupList) { - wakeupLists.push(wakeupBean.cpu); +function rightButtonOnClick(sp: SpSystemTrace,rightStar: HTMLElementAlias) { + Object.assign(sp, { + ext(): string { + return "Handle the right button click event"; + } + }) + + return function (event: any) { + if (SpSystemTrace.btnTimer) { + return; + } + // 唤醒树有值则不再重复添加 + const startIndex = CpuStruct.selectCpuStruct!.displayProcess?.indexOf('['); + if (SpSystemTrace.wakeupList.length === 0) { + SpSystemTrace.wakeupList.unshift(CpuStruct.wakeupBean!); + sp.queryCPUWakeUpList(CpuStruct.wakeupBean!); + CpuStruct.selectCpuStruct!.ts = CpuStruct.selectCpuStruct!.startTime; + CpuStruct.selectCpuStruct!.thread = CpuStruct.selectCpuStruct!.name; + CpuStruct.selectCpuStruct!.pid = CpuStruct.selectCpuStruct!.processId; + CpuStruct.selectCpuStruct!.process = CpuStruct.selectCpuStruct!.displayProcess?.substring(0, startIndex).trim(); + CpuStruct.selectCpuStruct!.itid = CpuStruct.wakeupBean!.itid; + sessionStorage.setItem('saveselectcpustruct', JSON.stringify(CpuStruct.selectCpuStruct)); + } else { + sp.wakeupListNull(); + SpSystemTrace.wakeupList.unshift(CpuStruct.wakeupBean!); + sp.queryCPUWakeUpList(CpuStruct.wakeupBean!); + CpuStruct.selectCpuStruct!.ts = CpuStruct.selectCpuStruct!.startTime; + CpuStruct.selectCpuStruct!.thread = CpuStruct.selectCpuStruct!.name; + CpuStruct.selectCpuStruct!.pid = CpuStruct.selectCpuStruct!.processId; + CpuStruct.selectCpuStruct!.process = CpuStruct.selectCpuStruct!.displayProcess?.substring(0, startIndex).trim(); + CpuStruct.selectCpuStruct!.itid = CpuStruct.wakeupBean!.itid; + sessionStorage.setItem('saveselectcpustruct', JSON.stringify(CpuStruct.selectCpuStruct)); + } + setTimeout(() => { + requestAnimationFrame(() => sp.refreshCanvas(false)); + }, 300); + rightStar!.style.visibility = 'visible'; + rightStar!.style.cursor = 'pointer'; + SpSystemTrace.btnTimer = setTimeout(() => { + SpSystemTrace.btnTimer = null; // 2.清空节流阀,方便下次开启定时器 + }, 2000); } - let wakeupCpuLists = Array.from(new Set(wakeupLists)).sort(); - for (let i = 0; i < wakeupCpuLists.length; i++) { - let cpuFavoriteRow: any = sp.shadowRoot?.querySelector>( - `trace-row[row-type='cpu-data'][row-id='${wakeupCpuLists[i]}']` - ); - if (cpuFavoriteRow === null || cpuFavoriteRow === undefined) { - continue; - } - cpuFavoriteRow!.setAttribute('collect-type', ''); - let replaceRow = document.createElement('div'); - replaceRow.setAttribute('row-id', cpuFavoriteRow.rowId + '-' + cpuFavoriteRow.rowType); - replaceRow.setAttribute('type', 'replaceRow'); - replaceRow.setAttribute('row-parent-id', cpuFavoriteRow.rowParentId); - replaceRow.style.display = 'none'; - cpuFavoriteRow.rowHidden = !cpuFavoriteRow.hasAttribute('scene'); - if (sp.rowsEL!.contains(cpuFavoriteRow)) { - sp.rowsEL!.replaceChild(replaceRow, cpuFavoriteRow); - } - cpuFavoriteRow.tampName = cpuFavoriteRow.name; - sp.favoriteChartListEL!.insertRow(cpuFavoriteRow, sp.currentCollectGroup, true); - sp.collectRows.push(cpuFavoriteRow); - sp.timerShaftEL?.displayCollect(sp.collectRows.length !== 0); - sp.currentClickRow = null; - cpuFavoriteRow.setAttribute('draggable', 'true'); - cpuFavoriteRow.addEventListener('dragstart', () => { +} +function rightStarOnClick(sp:SpSystemTrace) { + return function (ev:any){ + let wakeupLists = []; + wakeupLists.push(CpuStruct.selectCpuStruct?.cpu); + for (let wakeupBean of SpSystemTrace.wakeupList) { + wakeupLists.push(wakeupBean.cpu); + } + let wakeupCpuLists = Array.from(new Set(wakeupLists)).sort(); + for (let wakeupCpu of wakeupCpuLists) { + let cpuFavoriteRow: any = sp.shadowRoot?.querySelector>( + `trace-row[row-type='cpu-data'][row-id='${wakeupCpu}']` + ); + if (cpuFavoriteRow === null || cpuFavoriteRow === undefined) { + continue; + } + cpuFavoriteRow!.setAttribute('collect-type', ''); + let replaceRow = document.createElement('div'); + replaceRow.setAttribute('row-id', cpuFavoriteRow.rowId + '-' + cpuFavoriteRow.rowType); + replaceRow.setAttribute('type', 'replaceRow'); + replaceRow.setAttribute('row-parent-id', cpuFavoriteRow.rowParentId); + replaceRow.style.display = 'none'; + cpuFavoriteRow.rowHidden = !cpuFavoriteRow.hasAttribute('scene'); + if (sp.rowsEL!.contains(cpuFavoriteRow)) { + sp.rowsEL!.replaceChild(replaceRow, cpuFavoriteRow); + } + cpuFavoriteRow.tampName = cpuFavoriteRow.name; + sp.favoriteChartListEL!.insertRow(cpuFavoriteRow, sp.currentCollectGroup, true); + sp.collectRows.push(cpuFavoriteRow); + sp.timerShaftEL?.displayCollect(sp.collectRows.length !== 0); + sp.currentClickRow = null; + cpuFavoriteRow.setAttribute('draggable', 'true'); + cpuFavoriteRow.addEventListener('dragstart', cpuFavoriteRowDragStart(sp,cpuFavoriteRow)); + cpuFavoriteRow.addEventListener('dragover', cpuFavoriteRowDragOver(sp)); + cpuFavoriteRow.addEventListener('drop', cpuFavoriteRowDropHandler(sp,cpuFavoriteRow)); + cpuFavoriteRow.addEventListener('dragend', cpuFavoriteRowDragendHandler(sp)); + } + sp.refreshFavoriteCanvas(); + sp.refreshCanvas(true); + } +} +function cpuFavoriteRowDragStart(sp: SpSystemTrace, cpuFavoriteRow: any) { + return function () { sp.currentClickRow = cpuFavoriteRow; - }); - cpuFavoriteRow.addEventListener('dragover', (ev: any) => { + } +} +function cpuFavoriteRowDragOver(sp: SpSystemTrace) { + return function (ev:any){ ev.preventDefault(); ev.dataTransfer.dropEffect = 'move'; - }); - cpuFavoriteRow.addEventListener('drop', (ev: any) => { - if (sp.favoriteChartListEL != null && sp.currentClickRow != null && sp.currentClickRow !== cpuFavoriteRow) { - let rect = cpuFavoriteRow.getBoundingClientRect(); - if (ev.clientY >= rect.top && ev.clientY < rect.top + rect.height / 2) { - //向上移动 - sp.favoriteChartListEL.insertRowBefore(sp.currentClickRow, cpuFavoriteRow); - } else if (ev.clientY <= rect.bottom && ev.clientY > rect.top + rect.height / 2) { - //向下移动 - sp.favoriteChartListEL.insertRowBefore(sp.currentClickRow, cpuFavoriteRow.nextSibling); - } - sp.refreshFavoriteCanvas(); + } +} +function cpuFavoriteRowDropHandler(sp: SpSystemTrace, cpuFavoriteRow: any) { + return function (ev:any){ + if ( + sp.favoriteChartListEL != null && + sp.currentClickRow != null && + sp.currentClickRow !== cpuFavoriteRow + ) { + let rect = cpuFavoriteRow.getBoundingClientRect(); + if (ev.clientY >= rect.top && ev.clientY < rect.top + rect.height / 2) { + //向上移动 + sp.favoriteChartListEL.insertRowBefore(sp.currentClickRow, cpuFavoriteRow); + } else if (ev.clientY <= rect.bottom && ev.clientY > rect.top + rect.height / 2) { + //向下移动 + sp.favoriteChartListEL.insertRowBefore(sp.currentClickRow, cpuFavoriteRow.nextSibling); + } + sp.refreshFavoriteCanvas(); } - }); - cpuFavoriteRow.addEventListener('dragend', () => { + } +} +function cpuFavoriteRowDragendHandler(sp: SpSystemTrace) { + return function(){ sp.linkNodes.forEach((itln) => { - if (itln[0].rowEL.collect) { - itln[0].rowEL.translateY = itln[0].rowEL.getBoundingClientRect().top - 195; - } else { - itln[0].rowEL.translateY = itln[0].rowEL.offsetTop - sp.rowsPaneEL!.scrollTop; - } - if (itln[1].rowEL.collect) { - itln[1].rowEL.translateY = itln[1].rowEL.getBoundingClientRect().top - 195; - } else { - itln[1].rowEL.translateY = itln[1].rowEL.offsetTop - sp.rowsPaneEL!.scrollTop; - } - itln[0].y = itln[0].rowEL.translateY + itln[0].offsetY; - itln[1].y = itln[1].rowEL.translateY + itln[1].offsetY; + if (itln[0].rowEL.collect) { + itln[0].rowEL.translateY = itln[0].rowEL.getBoundingClientRect().top - 195; + } else { + itln[0].rowEL.translateY = itln[0].rowEL.offsetTop - sp.rowsPaneEL!.scrollTop; + } + if (itln[1].rowEL.collect) { + itln[1].rowEL.translateY = itln[1].rowEL.getBoundingClientRect().top - 195; + } else { + itln[1].rowEL.translateY = itln[1].rowEL.offsetTop - sp.rowsPaneEL!.scrollTop; + } + itln[0].y = itln[0].rowEL.translateY + itln[0].offsetY; + itln[1].y = itln[1].rowEL.translateY + itln[1].offsetY; }); sp.currentClickRow = null; - }); } - sp.refreshFavoriteCanvas(); - sp.refreshCanvas(true); - }); - document?.addEventListener('triangle-flag', (event: any) => { - let temporaryTime = sp.timerShaftEL?.drawTriangle(event.detail.time, event.detail.type); - if (event.detail.timeCallback && temporaryTime) event.detail.timeCallback(temporaryTime); - }); - - document?.addEventListener('number_calibration', (event: any) => { - sp.timerShaftEL!.sportRuler!.times = event.detail.time; - sp.timerShaftEL!.sportRuler!.counts = event.detail.counts; - sp.timerShaftEL!.sportRuler!.durations = event.detail.durations; - sp.timerShaftEL!.sportRuler?.draw(); - }); - - document?.addEventListener('flag-change', (event: any) => { - sp.timerShaftEL?.modifyFlagList(event.detail); - if (event.detail.hidden) { - sp.selectFlag = undefined; - if (sp._flagList.length <= 0) { - if (TraceRow.rangeSelectObject) { - let showTab = sp.getShowTab(); - showTab = showTab.filter((it) => it !== 'box-flag'); - sp.traceSheetEL?.displayTab(...showTab); - } else { - sp.traceSheetEL?.setAttribute('mode', 'hidden'); +} +function triangleFlagHandler(sp:SpSystemTrace) { + return function (event:any) { + let temporaryTime = sp.timerShaftEL?.drawTriangle(event.detail.time, event.detail.type); + if (event.detail.timeCallback && temporaryTime) event.detail.timeCallback(temporaryTime); + }; +} +function numberCalibrationHandler(sp: SpSystemTrace) { + return function (event: any) { + sp.timerShaftEL!.sportRuler!.times = event.detail.time; + sp.timerShaftEL!.sportRuler!.counts = event.detail.counts; + sp.timerShaftEL!.sportRuler!.durations = event.detail.durations; + sp.timerShaftEL!.sportRuler?.draw(); + } +} +function flagChangeHandler(sp: SpSystemTrace) { + return function (event: any) { + sp.timerShaftEL?.modifyFlagList(event.detail); + if (event.detail.hidden) { + sp.selectFlag = undefined; + if (sp._flagList.length <= 0) { + if (TraceRow.rangeSelectObject) { + let showTab = sp.getShowTab(); + showTab = showTab.filter((it) => it !== 'box-flag'); + sp.traceSheetEL?.displayTab(...showTab); + } else { + sp.traceSheetEL?.setAttribute('mode', 'hidden'); + } + } + sp.refreshCanvas(true); } - } - sp.refreshCanvas(true); } - }); - document?.addEventListener('slices-change', (event: any) => { - sp.timerShaftEL?.modifySlicesList(event.detail); - if (event.detail.hidden) { - sp.slicestime = null; - if (sp._slicesList.length <= 0) { - if (TraceRow.rangeSelectObject) { - let showTab = sp.getShowTab(); - showTab = showTab.filter((it) => it !== 'tabpane-current'); - sp.traceSheetEL?.displayTab(...showTab); +} +function slicesChangeHandler(sp:SpSystemTrace) { + return function (event: any) { + sp.timerShaftEL?.modifySlicesList(event.detail); + if (event.detail.hidden) { + sp.slicestime = null; + if (sp._slicesList.length <= 0) { + if (TraceRow.rangeSelectObject) { + let showTab = sp.getShowTab(); + showTab = showTab.filter((it) => it !== 'tabpane-current'); + sp.traceSheetEL?.displayTab(...showTab); + } else { + sp.traceSheetEL?.setAttribute('mode', 'hidden'); + } + } + sp.refreshCanvas(true); + } + } +} +function collectHandler(sp: SpSystemTrace) { + return function (event: any) { + let currentRow = event.detail.row; + if (currentRow.collect) { + collectHandlerYes(sp,currentRow,event); } else { - sp.traceSheetEL?.setAttribute('mode', 'hidden'); + collectHandlerNo(sp,currentRow,event); } - } - sp.refreshCanvas(true); - } - }); - if (sp.timerShaftEL?.collecBtn) { - sp.timerShaftEL.collecBtn.onclick = () => { - if (sp.timerShaftEL!.collecBtn!.hasAttribute('close')) { - sp.timerShaftEL!.collecBtn!.removeAttribute('close'); - sp.favoriteChartListEL?.showCollectArea(); - } else { - sp.timerShaftEL!.collecBtn!.setAttribute('close', ''); - sp.favoriteChartListEL?.hideCollectArea(); - } - }; - } - document?.addEventListener('collect', (event: any) => { - let currentRow = event.detail.row; - if (currentRow.collect) { - if ( - !sp.collectRows.find((find) => { - return find === currentRow; - }) - ) { - sp.collectRows.push(currentRow); - } - let replaceRow = document.createElement('div'); - replaceRow.setAttribute('row-id', currentRow.rowId + '-' + currentRow.rowType); - replaceRow.setAttribute('type', 'replaceRow'); - replaceRow.setAttribute('row-parent-id', currentRow.rowParentId); - replaceRow.style.display = 'none'; - if (!currentRow.hasAttribute('scene')) { - currentRow.setAttribute('row-hidden', ''); - } else { - currentRow.removeAttribute('row-hidden'); - } - // 添加收藏时,在线程名前面追加父亲ID - let rowParentId = currentRow.rowParentId; - currentRow.tampName = currentRow.name; - if (rowParentId) { - let parentRows = sp.shadowRoot?.querySelectorAll>(`trace-row[row-id='${rowParentId}']`); - parentRows?.forEach((parentRow) => { - if ( - parentRow?.name && - parentRow?.name != currentRow.name && - !parentRow.rowType!.startsWith('cpu') && - !parentRow.rowType!.startsWith('thread') && - !parentRow.rowType!.startsWith('func') && - !currentRow.name.includes(parentRow.name) - ) { - currentRow.name += '(' + parentRow.name + ')'; - } + sp.timerShaftEL?.displayCollect(sp.collectRows.length !== 0); + sp.refreshFavoriteCanvas(); + sp.refreshCanvas(true); + sp.linkNodes.forEach((itln) => { + if (itln[0].rowEL === currentRow) { + if (itln[0].rowEL.collect) { + itln[0].rowEL.translateY = itln[0].rowEL.getBoundingClientRect().top - 195; + } else { + itln[0].rowEL.translateY = itln[0].rowEL.offsetTop - sp.rowsPaneEL!.scrollTop; + } + itln[0].y = itln[0].rowEL.translateY + itln[0].offsetY; + } else if (itln[1].rowEL === currentRow) { + if (itln[1].rowEL.collect) { + itln[1].rowEL.translateY = itln[1].rowEL.getBoundingClientRect().top - 195; + } else { + itln[1].rowEL.translateY = itln[1].rowEL.offsetTop - sp.rowsPaneEL!.scrollTop; + } + itln[1].y = itln[1].rowEL.translateY + itln[1].offsetY; + } }); - } - if (!currentRow.hasParentRowEl) { - sp.rowsEL!.replaceChild(replaceRow, currentRow); - } - sp.favoriteChartListEL?.insertRow(currentRow, sp.currentCollectGroup, event.detail.type !== 'auto-collect'); - } else { - sp.favoriteChartListEL?.deleteRow(currentRow, event.detail.type !== 'auto-collect'); - if (event.detail.type !== 'auto-collect') { + // 收藏夹元素拖动排序功能 + sp.currentClickRow = null; + currentRow.setAttribute('draggable', 'true'); + currentRow.addEventListener('dragstart', () => { + sp.currentClickRow = currentRow; + }); + currentRow.addEventListener('dragover', (ev: any) => { + ev.preventDefault(); + ev.dataTransfer.dropEffect = 'move'; + }); + currentRow.addEventListener('drop', collectHandlerDrop(sp,currentRow)); + currentRow.addEventListener('dragend', collectHandlerDragEnd(sp)); + }; +} +function collectHandlerNo(sp: SpSystemTrace, currentRow: any, event: any) { + sp.favoriteChartListEL?.deleteRow(currentRow, event.detail.type !== 'auto-collect'); + if (event.detail.type !== 'auto-collect') { let rowIndex = sp.collectRows.indexOf(currentRow); if (rowIndex !== -1) { - sp.collectRows.splice(rowIndex, 1); + sp.collectRows.splice(rowIndex, 1); } - } - let row = currentRow; - let allowExpansionRow = []; - while (row.hasParentRowEl) { + } + let row = currentRow; + let allowExpansionRow = []; + while (row.hasParentRowEl) { let parent = row.parentRowEl; allowExpansionRow.push(parent); row = parent; - } - for (let index: number = allowExpansionRow.length - 1; index >= 0; index--) { + } + for (let index: number = allowExpansionRow.length - 1; index >= 0; index--) { if (allowExpansionRow[index]?.hasAttribute('scene')) { - if (allowExpansionRow[index]!.expansion) { - allowExpansionRow[index].updateChildRowStatus(); - } else { - allowExpansionRow[index].expansion = true; - } + if (allowExpansionRow[index]!.expansion) { + allowExpansionRow[index].updateChildRowStatus(); + } else { + allowExpansionRow[index].expansion = true; + } } - } - allowExpansionRow.length = 0; - let replaceRow = sp.rowsEL!.querySelector( - `div[row-id='${currentRow.rowId}-${currentRow.rowType}']` - ); - // 取消收藏时,删除父亲ID - currentRow.name = currentRow.tampName; - if (replaceRow != null) { + } + allowExpansionRow.length = 0; + let replaceRow = sp.rowsEL!.querySelector( + `div[row-id='${currentRow.rowId}-${currentRow.rowType}']` + ); + // 取消收藏时,删除父亲ID + currentRow.name = currentRow.tampName; + if (replaceRow != null) { sp.rowsEL!.replaceChild(currentRow, replaceRow); currentRow.style.boxShadow = `0 10px 10px #00000000`; - } } - sp.timerShaftEL?.displayCollect(sp.collectRows.length !== 0); - sp.refreshFavoriteCanvas(); - sp.refreshCanvas(true); - sp.linkNodes.forEach((itln) => { - if (itln[0].rowEL === currentRow) { - if (itln[0].rowEL.collect) { - itln[0].rowEL.translateY = itln[0].rowEL.getBoundingClientRect().top - 195; - } else { - itln[0].rowEL.translateY = itln[0].rowEL.offsetTop - sp.rowsPaneEL!.scrollTop; - } - itln[0].y = itln[0].rowEL.translateY + itln[0].offsetY; - } else if (itln[1].rowEL === currentRow) { - if (itln[1].rowEL.collect) { - itln[1].rowEL.translateY = itln[1].rowEL.getBoundingClientRect().top - 195; - } else { - itln[1].rowEL.translateY = itln[1].rowEL.offsetTop - sp.rowsPaneEL!.scrollTop; - } - itln[1].y = itln[1].rowEL.translateY + itln[1].offsetY; - } - }); - // 收藏夹元素拖动排序功能 - sp.currentClickRow = null; - currentRow.setAttribute('draggable', 'true'); - currentRow.addEventListener('dragstart', () => { - sp.currentClickRow = currentRow; - }); - currentRow.addEventListener('dragover', (ev: any) => { - ev.preventDefault(); - ev.dataTransfer.dropEffect = 'move'; - }); - currentRow.addEventListener('drop', (ev: any) => { - if (sp.favoriteChartListEL !== null && sp.currentClickRow !== null && sp.currentClickRow !== currentRow) { - let rect = currentRow.getBoundingClientRect(); - if (ev.clientY >= rect.top && ev.clientY < rect.top + rect.height / 2) { - //向上移动 - sp.favoriteChartListEL!.insertRowBefore(sp.currentClickRow!, currentRow); - } else if (ev.clientY <= rect.bottom && ev.clientY > rect.top + rect.height / 2) { - //向下移动 - sp.favoriteChartListEL!.insertRowBefore(sp.currentClickRow!, currentRow.nextSibling); - } - sp.refreshFavoriteCanvas(); - } - }); - currentRow.addEventListener('dragend', () => { - sp.linkNodes.forEach((itln) => { - if (itln[0].rowEL.collect) { - itln[0].rowEL.translateY = itln[0].rowEL.getBoundingClientRect().top - 195; - } else { - itln[0].rowEL.translateY = itln[0].rowEL.offsetTop - sp.rowsPaneEL!.scrollTop; - } - if (itln[1].rowEL.collect) { - itln[1].rowEL.translateY = itln[1].rowEL.getBoundingClientRect().top - 195; - } else { - itln[1].rowEL.translateY = itln[1].rowEL.offsetTop - sp.rowsPaneEL!.scrollTop; - } - itln[0].y = itln[0].rowEL.translateY + itln[0].offsetY; - itln[1].y = itln[1].rowEL.translateY + itln[1].offsetY; - }); - sp.currentClickRow = null; - }); - }); - SpSystemTrace.scrollViewWidth = sp.getScrollWidth(); - sp.rangeSelect.selectHandler = (rows, refreshCheckBox): void => { - rows.forEach((item) => { - sp.setAttribute('clickRow', item.rowType!); - sp.setAttribute('rowName', item.name); - sp.setAttribute('rowId', item.rowId!); - }); - if (rows.length == 0) { - const allRows = [ - ...sp.shadowRoot!.querySelectorAll>('trace-row'), - ...sp.favoriteChartListEL!.getAllCollectRows(), - ]; - for (const row of allRows) { - row.checkType = '-1'; - if (row.folder) { - row.childrenList.forEach((item) => { - row.checkType = '-1'; - }); - } - } - sp.refreshCanvas(true); - if (!SportRuler.isMouseInSportRuler) { - sp.traceSheetEL?.setAttribute('mode', 'hidden'); - } - return; +} +function collectHandlerYes(sp: SpSystemTrace, currentRow: any, event: any){ + if ( + !sp.collectRows.find((find) => { + return find === currentRow; + }) + ) { + sp.collectRows.push(currentRow); } - if (refreshCheckBox) { - if (rows.length > 0) { - sp.queryAllTraceRow().forEach((row) => { - row.checkType = '0'; - if (row.folder) { - row.childrenList.forEach((ite) => { - ite.checkType = '0'; - }); - } - }); - rows.forEach((it) => (it.checkType = '2')); - } else { - sp.queryAllTraceRow().forEach((row) => { - row.checkType = '-1'; - if (row.folder) { - row.childrenList.forEach((it) => { - it.checkType = '-1'; - }); - } + let replaceRow = document.createElement('div'); + replaceRow.setAttribute('row-id', currentRow.rowId + '-' + currentRow.rowType); + replaceRow.setAttribute('type', 'replaceRow'); + replaceRow.setAttribute('row-parent-id', currentRow.rowParentId); + replaceRow.style.display = 'none'; + if (!currentRow.hasAttribute('scene')) { + currentRow.setAttribute('row-hidden', ''); + } else { + currentRow.removeAttribute('row-hidden'); + } + // 添加收藏时,在线程名前面追加父亲ID + let rowParentId = currentRow.rowParentId; + currentRow.tampName = currentRow.name; + if (rowParentId) { + let parentRows = sp.shadowRoot?.querySelectorAll>(`trace-row[row-id='${rowParentId}']`); + parentRows?.forEach((parentRow) => { + if ( + parentRow?.name && + parentRow?.name != currentRow.name && + !parentRow.rowType!.startsWith('cpu') && + !parentRow.rowType!.startsWith('thread') && + !parentRow.rowType!.startsWith('func') && + !currentRow.name.includes(parentRow.name) + ) { + currentRow.name += '(' + parentRow.name + ')'; + } }); - return; - } } - if (!sp.isSelectClick) { - sp.rangeTraceRow = []; + if (!currentRow.hasParentRowEl) { + sp.rowsEL!.replaceChild(replaceRow, currentRow); } - let selection = new SelectionParam(); - selection.cpuStateRowsId = sp.stateRowsId; - selection.leftNs = TraceRow.rangeSelectObject?.startNS || 0; - selection.rightNs = TraceRow.rangeSelectObject?.endNS || 0; - selection.recordStartNs = (window as any).recordStartNS; - rows.forEach((it) => { - if (it.rowType == TraceRow.ROW_TYPE_CPU) { - selection.cpus.push(parseInt(it.rowId!)); - info('load CPU traceRow id is : ', it.rowId); - } else if (it.rowType == TraceRow.ROW_TYPE_CPU_STATE) { - let filterId = parseInt(it.rowId!); - if (selection.cpuStateFilterIds.indexOf(filterId) == -1) { - selection.cpuStateFilterIds.push(filterId); - } - } else if (it.rowType == TraceRow.ROW_TYPE_CPU_FREQ) { - let filterId = parseInt(it.rowId!); - let filterName = it.name!; - if (selection.cpuFreqFilterIds.indexOf(filterId) == -1) { - selection.cpuFreqFilterIds.push(filterId); - } - if (selection.cpuFreqFilterNames.indexOf(filterName) == -1) { - selection.cpuFreqFilterNames.push(filterName); - } - } else if (it.rowType == TraceRow.ROW_TYPE_CPU_FREQ_LIMIT) { - selection.cpuFreqLimit.push({ - maxFilterId: it.getAttribute('maxFilterId'), - minFilterId: it.getAttribute('minFilterId'), - cpu: it.getAttribute('cpu'), - }); - } else if (it.rowType == TraceRow.ROW_TYPE_PROCESS) { - sp.pushPidToSelection(selection, it.rowId!); - if (it.getAttribute('hasStartup') === 'true') { - selection.startup = true; - } - if (it.getAttribute('hasStaticInit') === 'true') { - selection.staticInit = true; - } - let processChildRows: Array> = [ - ...sp.shadowRoot!.querySelectorAll>(`trace-row[row-parent-id='${it.rowId}']`), - ]; - if (!it.expansion) { - processChildRows = [...it.childrenList]; - } - processChildRows.forEach((th) => { - th.rangeSelect = true; - th.checkType = '2'; - if (th.rowType == TraceRow.ROW_TYPE_THREAD) { - selection.threadIds.push(parseInt(th.rowId!)); - } else if (th.rowType == TraceRow.ROW_TYPE_FUNC) { - if (th.asyncFuncName) { - selection.funAsync.push({ - name: th.asyncFuncName, - pid: th.asyncFuncNamePID || 0, - }); - } else { - selection.funTids.push(parseInt(th.rowId!)); + sp.favoriteChartListEL?.insertRow(currentRow, sp.currentCollectGroup, event.detail.type !== 'auto-collect'); +} +function collectHandlerDrop(sp: SpSystemTrace, currentRow: HTMLDivElement|undefined|null) { + return function (ev:any) { + if (sp.favoriteChartListEL !== null && sp.currentClickRow !== null && sp.currentClickRow !== currentRow) { + let rect = currentRow!.getBoundingClientRect(); + if (ev.clientY >= rect.top && ev.clientY < rect.top + rect.height / 2) { + //向上移动 + sp.favoriteChartListEL!.insertRowBefore(sp.currentClickRow!, currentRow!); + } else if (ev.clientY <= rect.bottom && ev.clientY > rect.top + rect.height / 2) { + //向下移动 + sp.favoriteChartListEL!.insertRowBefore(sp.currentClickRow!, currentRow!.nextSibling!); } - } else if (th.rowType == TraceRow.ROW_TYPE_MEM) { - selection.processTrackIds.push(parseInt(th.rowId!)); - } - }); - info('load process traceRow id is : ', it.rowId); - } else if (it.rowType == TraceRow.ROW_TYPE_NATIVE_MEMORY) { - let memoryRows: Array> = [ - ...sp.shadowRoot!.querySelectorAll>(`trace-row[row-parent-id='${it.rowId}']`), - ]; - if (!it.expansion) { - memoryRows = [...it.childrenList]; - } - const rowKey = it.rowId!.split(' '); - const process = { - ipid: Number(rowKey[rowKey.length - 1]), - pid: Number(rowKey[rowKey.length - 2]), - }; - if (!isExistPidInArray(selection.nativeMemoryAllProcess, process.pid)) { - selection.nativeMemoryAllProcess.push(process); + sp.refreshFavoriteCanvas(); } - if (selection.nativeMemoryCurrentIPid === -1) { - selection.nativeMemoryCurrentIPid = process.ipid; - } - memoryRows.forEach((th) => { - th.rangeSelect = true; - th.checkType = '2'; - if (th.getAttribute('heap-type') === 'native_hook_statistic') { - selection.nativeMemoryStatistic.push(th.rowId!); - } else { - selection.nativeMemory.push(th.rowId!); - } - }); - info('load nativeMemory traceRow id is : ', it.rowId); - } else if (it.rowType == TraceRow.ROW_TYPE_STATIC_INIT) { - selection.staticInit = true; - sp.pushPidToSelection(selection, it.rowParentId!); - info('load thread traceRow id is : ', it.rowId); - } else if (it.rowType == TraceRow.ROW_TYPE_APP_STARTUP) { - selection.startup = true; - sp.pushPidToSelection(selection, it.rowParentId!); - info('load thread traceRow id is : ', it.rowId); - } else if (it.rowType == TraceRow.ROW_TYPE_THREAD) { - sp.pushPidToSelection(selection, it.rowParentId!); - selection.threadIds.push(parseInt(it.rowId!)); - info('load thread traceRow id is : ', it.rowId); - } else if (it.rowType == TraceRow.ROW_TYPE_FUNC) { - TabPaneTaskFrames.TaskArray = []; - sp.pushPidToSelection(selection, it.rowParentId!); - if (it.asyncFuncName) { - selection.funAsync.push({ - name: it.asyncFuncName, - pid: it.asyncFuncNamePID || 0, - }); - } else { - selection.funTids.push(parseInt(it.rowId!)); - } - - let isIntersect = (filterFunc: FuncStruct, rangeData: RangeSelectStruct) => - Math.max(filterFunc.startTs! + filterFunc.dur!, rangeData!.endNS || 0) - - Math.min(filterFunc.startTs!, rangeData!.startNS || 0) < - filterFunc.dur! + (rangeData!.endNS || 0) - (rangeData!.startNS || 0) && - filterFunc.funName!.indexOf('H:Task ') >= 0; - let taskData = it.dataListCache.filter((taskData: FuncStruct) => { - taskData!.tid = parseInt(it.rowId!); - return isIntersect(taskData, TraceRow.rangeSelectObject!); - }); - if (taskData.length > 0) { - selection.taskFramesData.push(...taskData); - } - info('load func traceRow id is : ', it.rowId); - } else if (it.rowType == TraceRow.ROW_TYPE_MEM || it.rowType == TraceRow.ROW_TYPE_VIRTUAL_MEMORY) { - if (it.rowType == TraceRow.ROW_TYPE_MEM) { - selection.processTrackIds.push(parseInt(it.rowId!)); - } else { - selection.virtualTrackIds.push(parseInt(it.rowId!)); - } - info('load memory traceRow id is : ', it.rowId); - } else if (it.rowType == TraceRow.ROW_TYPE_FPS) { - selection.hasFps = true; - info('load FPS traceRow id is : ', it.rowId); - } else if (it.rowType == TraceRow.ROW_TYPE_HEAP) { - const key = it.rowParentId!.split(' '); - const process = { - ipid: Number(key[key.length - 1]), - pid: Number(key[key.length - 2]), - }; - - if (!isExistPidInArray(selection.nativeMemoryAllProcess, process.pid)) { - selection.nativeMemoryAllProcess.push(process); - } - if (selection.nativeMemoryCurrentIPid === -1) { - selection.nativeMemoryCurrentIPid = process.ipid; - } - if (selection.nativeMemoryAllProcess) - if (it.getAttribute('heap-type') === 'native_hook_statistic') { - selection.nativeMemoryStatistic.push(it.rowId!); - } else { - selection.nativeMemory.push(it.rowId!); - } - info('load nativeMemory traceRow id is : ', it.rowId); - } else if (it.rowType == TraceRow.ROW_TYPE_MONITOR) { - let abilityChildRows: Array> = [ - ...sp.shadowRoot!.querySelectorAll>(`trace-row[row-parent-id='${it.rowId}']`), - ]; - if (!it.expansion) { - abilityChildRows = [...it.childrenList]; - } - abilityChildRows.forEach((th) => { - th.rangeSelect = true; - th.checkType = '2'; - if (th.rowType == TraceRow.ROW_TYPE_CPU_ABILITY) { - selection.cpuAbilityIds.push(th.rowId!); - } else if (th.rowType == TraceRow.ROW_TYPE_MEMORY_ABILITY) { - selection.memoryAbilityIds.push(th.rowId!); - } else if (th.rowType == TraceRow.ROW_TYPE_DISK_ABILITY) { - selection.diskAbilityIds.push(th.rowId!); - } else if (th.rowType == TraceRow.ROW_TYPE_NETWORK_ABILITY) { - selection.networkAbilityIds.push(th.rowId!); - } else if (th.rowType == TraceRow.ROW_TYPE_DMA_ABILITY) { - selection.dmaAbilityData.push(...intersectData(th)!); - } else if (th.rowType == TraceRow.ROW_TYPE_GPU_MEMORY_ABILITY) { - selection.gpuMemoryAbilityData.push(...intersectData(th)!); - } else if (th.rowType === TraceRow.ROW_TYPE_PURGEABLE_TOTAL_ABILITY) { - selection.purgeableTotalAbility.push(...intersectData(th)); - } else if (th.rowType === TraceRow.ROW_TYPE_PURGEABLE_PIN_ABILITY) { - selection.purgeablePinAbility.push(...intersectData(th)); - } - }); - } else if (it.rowType == TraceRow.ROW_TYPE_CPU_ABILITY) { - selection.cpuAbilityIds.push(it.rowId!); - info('load CPU Ability traceRow id is : ', it.rowId); - } else if (it.rowType == TraceRow.ROW_TYPE_MEMORY_ABILITY) { - selection.memoryAbilityIds.push(it.rowId!); - info('load Memory Ability traceRow id is : ', it.rowId); - } else if (it.rowType == TraceRow.ROW_TYPE_DISK_ABILITY) { - selection.diskAbilityIds.push(it.rowId!); - info('load DiskIo Ability traceRow id is : ', it.rowId); - } else if (it.rowType == TraceRow.ROW_TYPE_NETWORK_ABILITY) { - selection.networkAbilityIds.push(it.rowId!); - info('load Network Ability traceRow id is : ', it.rowId); - } else if (it.rowType == TraceRow.ROW_TYPE_DMA_ABILITY) { - selection.dmaAbilityData.push(...intersectData(it)!); - } else if (it.rowType == TraceRow.ROW_TYPE_GPU_MEMORY_ABILITY) { - selection.gpuMemoryAbilityData.push(...intersectData(it)!); - } else if (it.rowType?.startsWith(TraceRow.ROW_TYPE_SDK)) { - if (it.rowType == TraceRow.ROW_TYPE_SDK) { - let sdkRows: Array> = [ - ...sp.shadowRoot!.querySelectorAll>(`trace-row[row-parent-id='${it.rowId}']`), - ]; - if (!it.expansion) { - sdkRows = [...it.childrenList]; - } - sdkRows.forEach((th) => { - th.rangeSelect = true; - th.checkType = '2'; - }); - } - if (it.rowType == TraceRow.ROW_TYPE_SDK_COUNTER) { - selection.sdkCounterIds.push(it.rowId!); - } - if (it.rowType == TraceRow.ROW_TYPE_SDK_SLICE) { - selection.sdkSliceIds.push(it.rowId!); - } - } else if (it.rowType?.startsWith('hiperf')) { - if (it.rowType == TraceRow.ROW_TYPE_HIPERF_EVENT || it.rowType == TraceRow.ROW_TYPE_HIPERF_REPORT) { - return; - } - selection.perfEventTypeId = it.drawType === -2 ? undefined : it.drawType; - selection.perfSampleIds.push(1); - if (it.rowType === TraceRow.ROW_TYPE_PERF_CALLCHART) { - let setting = it.getRowSettingKeys(); - if (setting && setting.length > 0) { - //type 0:cpu,1:process,2:thread - let key: string = setting[0]; - let id = Number(key.split('-')[0]); - if (key.includes('p')) { - selection.perfProcess.push(id); - } else if (key.includes('t')) { - selection.perfThread.push(id); + }; +} +function collectHandlerDragEnd(sp: SpSystemTrace) { + return function (ev:any) { + sp.linkNodes.forEach((itln) => { + if (itln[0].rowEL.collect) { + itln[0].rowEL.translateY = itln[0].rowEL.getBoundingClientRect().top - 195; } else { - selection.perfCpus.push(id); - } - } - } - if (it.rowType == TraceRow.ROW_TYPE_HIPERF_PROCESS) { - let hiperfProcessRows: Array> = [ - ...sp.shadowRoot!.querySelectorAll>(`trace-row[row-parent-id='${it.rowId}']`), - ]; - if (!it.expansion) { - hiperfProcessRows = [...it.childrenList]; - } - hiperfProcessRows.forEach((th) => { - th.rangeSelect = true; - th.checkType = '2'; - }); - } - if (it.rowType == TraceRow.ROW_TYPE_HIPERF || it.rowId == 'HiPerf-cpu-merge') { - selection.perfAll = true; - } - if (it.rowType == TraceRow.ROW_TYPE_HIPERF_CPU) { - selection.perfCpus.push(it.index); - } - if (it.rowType == TraceRow.ROW_TYPE_HIPERF_PROCESS) { - selection.perfProcess.push(parseInt(it.rowId!.split('-')[0])); - } - if (it.rowType == TraceRow.ROW_TYPE_HIPERF_THREAD) { - selection.perfThread.push(parseInt(it.rowId!.split('-')[0])); - } - } else if (it.rowType == TraceRow.ROW_TYPE_FILE_SYSTEM) { - if (it.rowId == 'FileSystemLogicalWrite') { - if (selection.fileSystemType.length == 0) { - selection.fileSystemType = [0, 1, 3]; - } else { - if (selection.fileSystemType.indexOf(3) == -1) { - selection.fileSystemType.push(3); + itln[0].rowEL.translateY = itln[0].rowEL.offsetTop - sp.rowsPaneEL!.scrollTop; } - } - } else if (it.rowId == 'FileSystemLogicalRead') { - if (selection.fileSystemType.length == 0) { - selection.fileSystemType = [0, 1, 2]; - } else { - if (selection.fileSystemType.indexOf(2) == -1) { - selection.fileSystemType.push(2); + if (itln[1].rowEL.collect) { + itln[1].rowEL.translateY = itln[1].rowEL.getBoundingClientRect().top - 195; + } else { + itln[1].rowEL.translateY = itln[1].rowEL.offsetTop - sp.rowsPaneEL!.scrollTop; } - } - } else if (it.rowId == 'FileSystemVirtualMemory') { - selection.fileSysVirtualMemory = true; - } else if (it.rowId == 'FileSystemDiskIOLatency') { - selection.diskIOLatency = true; - } else { - if (!selection.diskIOLatency) { - let arr = it.rowId!.split('-').reverse(); - let ipid = parseInt(arr[0]); - if (selection.diskIOipids.indexOf(ipid) == -1) { - selection.diskIOipids.push(ipid); + itln[0].y = itln[0].rowEL.translateY + itln[0].offsetY; + itln[1].y = itln[1].rowEL.translateY + itln[1].offsetY; + }); + sp.currentClickRow = null; + }; +} +function selectHandler(sp: SpSystemTrace) { + sp.rangeSelect.selectHandler = (rows, refreshCheckBox): void => { + rows.forEach((item) => { + sp.setAttribute('clickRow', item.rowType!); + sp.setAttribute('rowName', item.name); + sp.setAttribute('rowId', item.rowId!); + }); + if (rows.length == 0) { + const allRows = [ + ...sp.shadowRoot!.querySelectorAll>('trace-row'), + ...sp.favoriteChartListEL!.getAllCollectRows(), + ]; + for (const row of allRows) { + row.checkType = '-1'; + if (row.folder) { + row.childrenList.forEach((item) => { + row.checkType = '-1'; + }); + } } - if (arr[1] == 'read') { - selection.diskIOReadIds.indexOf(ipid) == -1 ? selection.diskIOReadIds.push(ipid) : ''; - } else if (arr[1] == 'write') { - selection.diskIOWriteIds.indexOf(ipid) == -1 ? selection.diskIOWriteIds.push(ipid) : ''; + sp.refreshCanvas(true); + if (!SportRuler.isMouseInSportRuler) { + sp.traceSheetEL?.setAttribute('mode', 'hidden'); } - } - } - } else if (it.rowType == TraceRow.ROW_TYPE_POWER_ENERGY) { - selection.powerEnergy.push(it.rowId!); - } else if (it.rowType == TraceRow.ROW_TYPE_SYSTEM_ENERGY) { - selection.systemEnergy.push(it.rowId!); - } else if (it.rowType == TraceRow.ROW_TYPE_ANOMALY_ENERGY) { - selection.anomalyEnergy.push(it.rowId!); - } else if (it.rowType == TraceRow.ROW_TYPE_SYSTEM_ENERGY) { - info('load anomaly Energy traceRow id is : ', it.rowId); - } else if (it.rowType == TraceRow.ROW_TYPE_VM_TRACKER_SMAPS) { - selection.smapsType.push(...intersectData(it)!); - let sMapsChildRows: Array> = [ - ...sp.shadowRoot!.querySelectorAll>(`trace-row[row-parent-id='${it.rowId}']`), - ]; - if (!it.expansion) { - sMapsChildRows = [...it.childrenList]; - } - sMapsChildRows.forEach((item) => { - item.rangeSelect = true; - if (item.rowType == TraceRow.ROW_TYPE_VM_TRACKER_SMAPS) { - selection.smapsType.push(...intersectData(item)!); - } - }); - } else if (it.rowType == TraceRow.ROW_TYPE_VMTRACKER_SHM) { - selection.vmtrackershm.push(...intersectData(it)!); - } else if (it.rowType == TraceRow.ROW_TYPE_CLOCK) { - selection.clockMapData.set(it.rowId || '', it.getCacheData); - } else if (it.rowType == TraceRow.ROW_TYPE_IRQ) { - if (it.getAttribute('cat') === 'irq') { - selection.irqCallIds.push(parseInt(it.getAttribute('callId') || '-1')); - } else { - selection.softIrqCallIds.push(parseInt(it.getAttribute('callId') || '-1')); + return; } - } else if (it.rowType === TraceRow.ROW_TYPE_VM_TRACKER) { - let vMTrackerChildRows: Array> = [ - ...sp.shadowRoot!.querySelectorAll>(`trace-row[row-parent-id='${it.rowId}']`), - ]; - if (!it.expansion) { - vMTrackerChildRows = [...it.childrenList]; + selectHandlerRefreshCheckBox(sp,rows, refreshCheckBox); + if (!sp.isSelectClick) { + sp.rangeTraceRow = []; } - vMTrackerChildRows.forEach((th) => { - th.rangeSelect = true; - if (th.rowType === TraceRow.ROW_TYPE_DMA_VMTRACKER) { - selection.dmaVmTrackerData.push(...intersectData(th)!); - } else if (th.rowType === TraceRow.ROW_TYPE_SYS_MEMORY_GPU) { - let vMTrackerGpuChildRows: Array> = [ - ...sp.shadowRoot!.querySelectorAll>(`trace-row[row-parent-id='${th.rowId}']`), - ]; - if (!th.expansion) { - vMTrackerGpuChildRows = [...th.childrenList]; - } - vMTrackerGpuChildRows.forEach((item) => { - item.rangeSelect = true; - if (item.rowType == TraceRow.ROW_TYPE_GPU_MEMORY_VMTRACKER) { - selection.gpuMemoryTrackerData.push(...intersectData(item)!); - } else if (item.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_GL) { - selection.gpu.gl = - item.dataListCache.filter( - (it) => - (it.startNs >= selection.leftNs && it.startNs <= selection.rightNs) || - (it.endNs >= selection.leftNs && it.endNs <= selection.rightNs) - ).length > 0; - } else if (item.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_GRAPH) { - selection.gpu.graph = - item.dataListCache.filter( - (it) => - (it.startNs >= selection.leftNs && it.startNs <= selection.rightNs) || - (it.endNs >= selection.leftNs && it.endNs <= selection.rightNs) - ).length > 0; - } else if (item.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_TOTAL) { - selection.gpu.gpuTotal = - item.dataListCache.filter( - (it) => - (it.startNs >= selection.leftNs && it.startNs <= selection.rightNs) || - (it.endNs >= selection.leftNs && it.endNs <= selection.rightNs) - ).length > 0; - } else if (item.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_WINDOW) { - selection.gpu.gpuWindow = - item.dataListCache.filter( - (it) => - (it.startNs >= selection.leftNs && it.startNs <= selection.rightNs) || - (it.endNs >= selection.leftNs && it.endNs <= selection.rightNs) - ).length > 0; - } + selectHandlerRows(sp, rows); + }; +} +function selectHandlerRefreshCheckBox(sp: SpSystemTrace, rows: Array>, refreshCheckBox: boolean) { + if (refreshCheckBox) { + if (rows.length > 0) { + sp.queryAllTraceRow().forEach((row) => { + row.checkType = '0'; + if (row.folder) { + row.childrenList.forEach((ite) => ite.checkType = '0'); + } }); - } else if (th.rowType === TraceRow.ROW_TYPE_PURGEABLE_TOTAL_VM) { - selection.purgeableTotalVM.push(...intersectData(th)); - } else if (th.rowType === TraceRow.ROW_TYPE_PURGEABLE_PIN_VM) { - selection.purgeablePinVM.push(...intersectData(th)); - } else if (th.rowType === TraceRow.ROW_TYPE_VM_TRACKER_SMAPS) { - let sMapsChildRows: Array> = [ - ...sp.shadowRoot!.querySelectorAll>(`trace-row[row-parent-id='${th.rowId}']`), - ]; - if (!th.expansion) { - sMapsChildRows = [...th.childrenList]; - } - sMapsChildRows.forEach((item) => { - item.rangeSelect = true; - if (item.rowType == TraceRow.ROW_TYPE_VM_TRACKER_SMAPS) { - selection.smapsType.push(...intersectData(item)!); - } + rows.forEach((it) => it.checkType = '2'); + } else { + sp.queryAllTraceRow().forEach((row) => { + row.checkType = '-1'; + if (row.folder) { + row.childrenList.forEach((it) => it.checkType = '-1'); + } }); - } else if (th.rowType == TraceRow.ROW_TYPE_VMTRACKER_SHM) { - selection.vmtrackershm.push(...intersectData(th)!); - } - }); - } else if (it.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU) { - let vMTrackerGpuChildRows: Array> = [ - ...sp.shadowRoot!.querySelectorAll>(`trace-row[row-parent-id='${it.rowId}']`), - ]; - if (!it.expansion) { - vMTrackerGpuChildRows = [...it.childrenList]; + return; } - vMTrackerGpuChildRows.forEach((th) => { - th.rangeSelect = true; - if (th.rowType == TraceRow.ROW_TYPE_GPU_MEMORY_VMTRACKER) { - selection.gpuMemoryTrackerData.push(...intersectData(th)!); - } else if (th.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_GL) { - selection.gpu.gl = - th.dataListCache.filter( - (it) => - (it.startNs >= selection.leftNs && it.startNs <= selection.rightNs) || - (it.endNs >= selection.leftNs && it.endNs <= selection.rightNs) - ).length > 0; - } else if (th.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_GRAPH) { - selection.gpu.graph = - th.dataListCache.filter( - (it) => - (it.startNs >= selection.leftNs && it.startNs <= selection.rightNs) || - (it.endNs >= selection.leftNs && it.endNs <= selection.rightNs) - ).length > 0; - } else if (th.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_TOTAL) { - selection.gpu.gpuTotal = - th.dataListCache.filter( - (it) => - (it.startNs >= selection.leftNs && it.startNs <= selection.rightNs) || - (it.endNs >= selection.leftNs && it.endNs <= selection.rightNs) - ).length > 0; - } else if (th.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_WINDOW) { - selection.gpu.gpuWindow = - th.dataListCache.filter( - (it) => - (it.startNs >= selection.leftNs && it.startNs <= selection.rightNs) || - (it.endNs >= selection.leftNs && it.endNs <= selection.rightNs) - ).length > 0; - } - }); - } else if (it.rowType == TraceRow.ROW_TYPE_GPU_MEMORY_VMTRACKER) { - selection.gpuMemoryTrackerData.push(...intersectData(it)!); - } else if (it.rowType == TraceRow.ROW_TYPE_DMA_VMTRACKER) { - selection.dmaVmTrackerData.push(...intersectData(it)!); - } else if (it.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_GL) { - selection.gpu.gl = - it.dataListCache.filter( - (it) => - (it.startNs >= selection.leftNs && it.startNs <= selection.rightNs) || - (it.endNs >= selection.leftNs && it.endNs <= selection.rightNs) - ).length > 0; - } else if (it.rowType === TraceRow.ROW_TYPE_SYS_MEMORY_GPU_GRAPH) { - selection.gpu.graph = - it.dataListCache.filter( - (it) => - (it.startNs >= selection.leftNs && it.startNs <= selection.rightNs) || - (it.endNs >= selection.leftNs && it.endNs <= selection.rightNs) - ).length > 0; - } else if (it.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_TOTAL) { - selection.gpu.gpuTotal = - it.dataListCache.filter( - (it) => - (it.startNs >= selection.leftNs && it.startNs <= selection.rightNs) || - (it.endNs >= selection.leftNs && it.endNs <= selection.rightNs) - ).length > 0; - } else if (it.rowType == TraceRow.ROW_TYPE_SYS_MEMORY_GPU_WINDOW) { - selection.gpu.gpuWindow = - it.dataListCache.filter( - (it) => - (it.startNs >= selection.leftNs && it.startNs <= selection.rightNs) || - (it.endNs >= selection.leftNs && it.endNs <= selection.rightNs) - ).length > 0; - } else if (it.rowType == TraceRow.ROW_TYPE_JANK) { - let isIntersect = (filterJank: JanksStruct, rangeData: RangeSelectStruct) => - Math.max(filterJank.ts! + filterJank.dur!, rangeData!.endNS || 0) - - Math.min(filterJank.ts!, rangeData!.startNS || 0) < - filterJank.dur! + (rangeData!.endNS || 0) - (rangeData!.startNS || 0); - if (it.name == 'Actual Timeline') { - if (it.rowParentId === 'frameTime') { - it.dataListCache.forEach((jankData: any) => { - if (isIntersect(jankData, TraceRow.rangeSelectObject!)) { - selection.jankFramesData.push(jankData); - } + } +} +function selectHandlerRows(sp: SpSystemTrace, rows: Array>) { + let selection = new SelectionParam(); + selection.cpuStateRowsId = sp.stateRowsId; + selection.leftNs = TraceRow.rangeSelectObject?.startNS || 0; + selection.rightNs = TraceRow.rangeSelectObject?.endNS || 0; + selection.recordStartNs = (window as any).recordStartNS; + rows.forEach((it) => { + selection.pushSelection(it, sp); + if (sp.rangeTraceRow!.length !== rows.length) { + let event = sp.createPointEvent(it); + SpStatisticsHttpUtil.addOrdinaryVisitAction({ + action: 'trace_row', + event: event, }); - } else { - selection.jankFramesData.push(it.rowParentId); - } - } else if (it.folder) { - selection.jankFramesData = []; - it.childrenList.forEach((child) => { - if (child.rowType == TraceRow.ROW_TYPE_JANK && child.name == 'Actual Timeline') { - if (it.rowParentId === 'frameTime') { - it.dataListCache.forEach((jankData: any) => { - if (isIntersect(jankData, TraceRow.rangeSelectObject!)) { - selection.jankFramesData.push(jankData); - } - }); - } else { - selection.jankFramesData.push(child.rowParentId); - } - } - }); - } - } else if (it.rowType == TraceRow.ROW_TYPE_HEAP_TIMELINE) { - let endNS = TraceRow.rangeSelectObject?.endNS ? TraceRow.rangeSelectObject?.endNS : TraceRow.range?.endNS; - let startNS = TraceRow.rangeSelectObject?.startNS - ? TraceRow.rangeSelectObject?.startNS - : TraceRow.range?.startNS; - let minNodeId, maxNodeId; - if (!it.dataListCache || it.dataListCache.length === 0) { - return; } - for (let sample of it.dataListCache) { - if (sample.timestamp * 1000 <= startNS!) { - minNodeId = sample.lastAssignedId; - } - // 个别文件的sample的最大timestamp小于时间的框选结束时间,不能给maxNodeId赋值 - // 所以加上此条件:sample.timestamp === it.dataListCache[it.dataListCache.length -1].timestamp - if ( - sample.timestamp * 1000 >= endNS! || - sample.timestamp === it.dataListCache[it.dataListCache.length - 1].timestamp - ) { - if (maxNodeId === undefined) { - maxNodeId = sample.lastAssignedId; - } - } - } - - // If the start time range of the selected box is greater than the end time of the sampled data - if (startNS! >= it.dataListCache[it.dataListCache.length - 1].timestamp * 1000) { - minNodeId = it.dataListCache[it.dataListCache.length - 1].lastAssignedId; - } - // If you select the box from the beginning - if (startNS! <= TraceRow.range?.startNS!) { - minNodeId = HeapDataInterface.getInstance().getMinNodeId(sp.snapshotFiles!.id); - } - //If you select the box from the ending - if ( - endNS! >= TraceRow.range?.endNS! || - endNS! >= it.dataListCache[it.dataListCache.length - 1].timestampUs * 1000 - ) { - maxNodeId = HeapDataInterface.getInstance().getMaxNodeId(sp.snapshotFiles!.id); - } - let summary = (sp.traceSheetEL?.shadowRoot?.querySelector('#tabs') as LitTabs) - ?.querySelector('#box-heap-summary') - ?.querySelector('tabpane-summary') as TabPaneSummary; - summary.initSummaryData(sp.snapshotFiles!, minNodeId, maxNodeId); - selection.jsMemory.push(1); - } else if (it.rowType == TraceRow.ROW_TYPE_JS_CPU_PROFILER) { - let isIntersect = (a: JsCpuProfilerStruct, b: RangeSelectStruct) => - Math.max(a.startTime! + a.totalTime!, b!.endNS || 0) - Math.min(a.startTime!, b!.startNS || 0) < - a.totalTime! + (b!.endNS || 0) - (b!.startNS || 0); - let frameSelectData = it.dataListCache.filter((frameSelectData: any) => { - return isIntersect(frameSelectData, TraceRow.rangeSelectObject!); - }); - let copyFrameSelectData = JSON.parse(JSON.stringify(frameSelectData)); - let frameSelectDataIdArr: Array = []; - for (let data of copyFrameSelectData) { - frameSelectDataIdArr.push(data.id); - } - let jsCpuProfilerData = copyFrameSelectData.filter((item: any) => { - if (item.depth === 0) { - setSelectState(item, frameSelectDataIdArr); - item.isSelect = true; - return item; - } - }); - selection.jsCpuProfilerData = jsCpuProfilerData; - } else if (it.rowType == TraceRow.ROW_TYPE_FRAME_ANIMATION) { - let isIntersect = (animationStruct: FrameAnimationStruct, selectStruct: RangeSelectStruct) => - Math.max(animationStruct.startTs! + animationStruct.dur!, selectStruct!.endNS || 0) - - Math.min(animationStruct.startTs!, selectStruct!.startNS || 0) < - animationStruct.dur! + (selectStruct!.endNS || 0) - (selectStruct!.startNS || 0); - let frameAnimationList = it.dataListCache.filter((frameAnimationBean: FrameAnimationStruct) => { - return isIntersect(frameAnimationBean, TraceRow.rangeSelectObject!); - }); - selection.frameAnimation.push(...frameAnimationList); - } else if (it.rowType == TraceRow.ROW_TYPE_FRAME_DYNAMIC) { - let appName = it.getAttribute('model-name'); - let isSelect = (dynamicStruct: FrameDynamicStruct, b: RangeSelectStruct) => - dynamicStruct.ts >= b.startNS! && dynamicStruct.ts <= b.endNS!; - let frameDynamicList = it.dataListCache.filter( - (frameAnimationBean: FrameDynamicStruct) => - isSelect(frameAnimationBean, TraceRow.rangeSelectObject!) && - frameAnimationBean.groupId !== -1 && - frameAnimationBean.appName === appName - ); - selection.frameDynamic.push(...frameDynamicList); - } else if (it.rowType == TraceRow.ROW_TYPE_FRAME_SPACING) { - let appName = it.getAttribute('model-name'); - let isSelect = (a: FrameSpacingStruct, b: RangeSelectStruct) => - a.currentTs >= b.startNS! && a.currentTs <= b.endNS!; - let frameDatas = it.dataListCache.filter((frameData: FrameSpacingStruct) => { - return ( - isSelect(frameData, TraceRow.rangeSelectObject!) && - frameData.groupId !== -1 && - frameData.frameSpacingResult !== -1 && - frameData.nameId === appName - ); - }); - selection.frameSpacing.push(...frameDatas); - } else if (it.rowType == TraceRow.ROW_TYPE_PURGEABLE_TOTAL_ABILITY) { - selection.purgeableTotalAbility.push(...intersectData(it)); - } else if (it.rowType == TraceRow.ROW_TYPE_PURGEABLE_PIN_ABILITY) { - selection.purgeablePinAbility.push(...intersectData(it)); - } else if (it.rowType == TraceRow.ROW_TYPE_PURGEABLE_TOTAL_VM) { - selection.purgeableTotalVM.push(...intersectData(it)); - } else if (it.rowType == TraceRow.ROW_TYPE_PURGEABLE_PIN_VM) { - selection.purgeablePinVM.push(...intersectData(it)); - } else if (it.rowType === TraceRow.ROW_TYPE_LOGS) { - selection.hiLogs.push(it.rowId!); - } else if (it.rowType === TraceRow.ROW_TYPE_HI_SYSEVENT) { - selection.hiSysEvents.push(it.rowId!); - } - if (sp.rangeTraceRow!.length !== rows.length) { - let event = sp.createPointEvent(it); - SpStatisticsHttpUtil.addOrdinaryVisitAction({ - action: 'trace_row', - event: event, - }); - } }); - sp.rangeTraceRow = rows; - sp.isSelectClick = false; if (selection.diskIOipids.length > 0 && !selection.diskIOLatency) { - selection.promiseList.push( - queryEbpfSamplesCount( - TraceRow.rangeSelectObject?.startNS || 0, - TraceRow.rangeSelectObject?.endNS || 0, - selection.diskIOipids - ).then((res) => { - if (res.length > 0) { - selection.fsCount = res[0].fsCount; - selection.vmCount = res[0].vmCount; - } - return new Promise((resolve) => resolve(1)); - }) - ); + selection.promiseList.push( + queryEbpfSamplesCount( + TraceRow.rangeSelectObject?.startNS || 0, + TraceRow.rangeSelectObject?.endNS || 0, + selection.diskIOipids + ).then((res) => { + if (res.length > 0) { + selection.fsCount = res[0].fsCount; + selection.vmCount = res[0].vmCount; + } + return new Promise((resolve) => resolve(1)); + }) + ); } + sp.rangeTraceRow = rows; + sp.isSelectClick = false; sp.selectStructNull(); sp.timerShaftEL?.removeTriangle('inverted'); if (selection.promiseList.length > 0) { - Promise.all(selection.promiseList).then(() => { - selection.promiseList = []; - sp.traceSheetEL?.rangeSelect(selection); - }); + Promise.all(selection.promiseList).then(() => { + selection.promiseList = []; + sp.traceSheetEL?.rangeSelect(selection); + }); } else { - sp.traceSheetEL?.rangeSelect(selection); + sp.traceSheetEL?.rangeSelect(selection); } sp.timerShaftEL!.selectionList.push(selection); // 保持选中对象,为后面的再次选中该框选区域做准备。 sp.selectionParam = selection; - }; - // @ts-ignore - new ResizeObserver((entries) => { - TraceRow.FRAME_WIDTH = sp.clientWidth - 249 - sp.getScrollWidth(); - requestAnimationFrame(() => { - sp.timerShaftEL?.updateWidth(sp.clientWidth - 1 - sp.getScrollWidth()); - sp.shadowRoot!.querySelectorAll>('trace-row').forEach((it) => { - it.updateWidth(sp.clientWidth); - }); - }); - }).observe(sp); +} +function resizeObserverHandler(sp:SpSystemTrace) { + // @ts-ignore + new ResizeObserver((entries) => { + TraceRow.FRAME_WIDTH = sp.clientWidth - 249 - sp.getScrollWidth(); + requestAnimationFrame(() => { + sp.timerShaftEL?.updateWidth(sp.clientWidth - 1 - sp.getScrollWidth()); + sp.shadowRoot!.querySelectorAll>('trace-row').forEach((it) => { + it.updateWidth(sp.clientWidth); + }); + }); + }).observe(sp); - new ResizeObserver((entries) => { - sp.canvasPanelConfig(); - if (sp.traceSheetEL!.getAttribute('mode') == 'hidden') { - sp.timerShaftEL?.removeTriangle('triangle'); - } - sp.refreshFavoriteCanvas(); - sp.refreshCanvas(true); - }).observe(sp.rowsPaneEL!); - new MutationObserver((mutations, observer) => { - for (const mutation of mutations) { - if (mutation.type === 'attributes') { - if (sp.style.visibility === 'visible') { - if (TraceRow.rangeSelectObject && SpSystemTrace.sliceRangeMark) { - sp.timerShaftEL?.setSlicesMark( - TraceRow.rangeSelectObject.startNS || 0, - TraceRow.rangeSelectObject.endNS || 0, - false - ); - SpSystemTrace.sliceRangeMark = undefined; - window.publish(window.SmartEvent.UI.RefreshCanvas, {}); - } + new ResizeObserver((entries) => { + sp.canvasPanelConfig(); + if (sp.traceSheetEL!.getAttribute('mode') == 'hidden') { + sp.timerShaftEL?.removeTriangle('triangle'); } - } - } - }).observe(sp, { - attributes: true, - childList: false, - subtree: false, - }); - - sp.intersectionObserver = new IntersectionObserver( - (entries) => { - entries.forEach((it) => { - let tr = it.target as TraceRow; - tr.intersectionRatio = it.intersectionRatio; - if (!it.isIntersecting) { - tr.sleeping = true; - sp.invisibleRows.indexOf(tr) == -1 && sp.invisibleRows.push(tr); - sp.visibleRows = sp.visibleRows.filter((it) => !it.sleeping); - } else { - tr.sleeping = false; - sp.visibleRows.indexOf(tr) == -1 && sp.visibleRows.push(tr); - sp.invisibleRows = sp.invisibleRows.filter((it) => it.sleeping); + sp.refreshFavoriteCanvas(); + sp.refreshCanvas(true); + }).observe(sp.rowsPaneEL!); +} +function mutationObserverHandler(sp: SpSystemTrace) { + new MutationObserver((mutations, observer) => { + for (const mutation of mutations) { + if (mutation.type === 'attributes') { + if (sp.style.visibility === 'visible') { + if (TraceRow.rangeSelectObject && SpSystemTrace.sliceRangeMark) { + sp.timerShaftEL?.setSlicesMark( + TraceRow.rangeSelectObject.startNS || 0, + TraceRow.rangeSelectObject.endNS || 0, + false + ); + SpSystemTrace.sliceRangeMark = undefined; + window.publish(window.SmartEvent.UI.RefreshCanvas, {}); + } + } + } } - sp.visibleRows - .filter((vr) => vr.expansion) - .forEach((vr) => { - vr.sticky = sp.visibleRows.some((vro) => vr.childrenList.filter((it) => !it.collect).indexOf(vro) >= 0); + }).observe(sp, { + attributes: true, + childList: false, + subtree: false, + }); +} +function intersectionObserverHandler(sp: SpSystemTrace) { + sp.intersectionObserver = new IntersectionObserver( + (entries) => { + entries.forEach((it) => { + let tr = it.target as TraceRow; + tr.intersectionRatio = it.intersectionRatio; + if (!it.isIntersecting) { + tr.sleeping = true; + sp.invisibleRows.indexOf(tr) == -1 && sp.invisibleRows.push(tr); + sp.visibleRows = sp.visibleRows.filter((it) => !it.sleeping); + } else { + tr.sleeping = false; + sp.visibleRows.indexOf(tr) == -1 && sp.visibleRows.push(tr); + sp.invisibleRows = sp.invisibleRows.filter((it) => it.sleeping); + } + sp.visibleRows + .filter((vr) => vr.expansion) + .forEach((vr) => { + vr.sticky = sp.visibleRows.some((vro) => vr.childrenList.filter((it) => !it.collect).indexOf(vro) >= 0); + }); + sp.visibleRows + .filter((vr) => !vr.folder && vr.parentRowEl && vr.parentRowEl.expansion) + .forEach((vr) => (vr.parentRowEl!.sticky = true)); + if (sp.handler) { + clearTimeout(sp.handler); + } + sp.handler = setTimeout(() => sp.refreshCanvas(false), 100); }); - sp.visibleRows - .filter((vr) => !vr.folder && vr.parentRowEl && vr.parentRowEl.expansion) - .forEach((vr) => (vr.parentRowEl!.sticky = true)); - if (sp.handler) { - clearTimeout(sp.handler); + }, + { threshold: [0, 0.01, 0.99, 1] } + ); +} +function observerHandler(sp: SpSystemTrace) { + resizeObserverHandler(sp); + mutationObserverHandler(sp); + intersectionObserverHandler(sp); +} +function windowKeyDownHandler(sp: SpSystemTrace) { + return function (ev: KeyboardEvent) { + if (ev.key.toLocaleLowerCase() === 'escape') { + sp.queryAllTraceRow().forEach((it) => { + it.checkType = '-1'; + }); + TraceRow.rangeSelectObject = undefined; + sp.rangeSelect.rangeTraceRow = []; + sp.selectStructNull(); + sp.timerShaftEL?.setSlicesMark(); + sp.traceSheetEL?.setAttribute('mode', 'hidden'); + sp.removeLinkLinesByBusinessType('janks', 'task'); } - sp.handler = setTimeout(() => sp.refreshCanvas(false), 100); - }); - }, - { threshold: [0, 0.01, 0.99, 1] } - ); - window.addEventListener('keydown', (ev) => { - if (ev.key.toLocaleLowerCase() === 'escape') { - sp.queryAllTraceRow().forEach((it) => { - it.checkType = '-1'; - }); - TraceRow.rangeSelectObject = undefined; - sp.rangeSelect.rangeTraceRow = []; - sp.selectStructNull(); - sp.timerShaftEL?.setSlicesMark(); - sp.traceSheetEL?.setAttribute('mode', 'hidden'); - sp.removeLinkLinesByBusinessType('janks', 'task'); - } - }); - sp.chartManager = new SpChartManager(sp); - sp.canvasPanel = sp.shadowRoot!.querySelector('#canvas-panel')!; - sp.canvasPanelCtx = sp.canvasPanel.getContext('2d'); - sp.canvasFavoritePanelCtx = sp.favoriteChartListEL!.context(); - sp.canvasPanelConfig(); - window.subscribe(window.SmartEvent.UI.SliceMark, (data) => { - sp.sliceMarkEventHandler(data); - }); - window.subscribe(window.SmartEvent.UI.TraceRowComplete, (tr) => {}); - window.subscribe(window.SmartEvent.UI.RefreshCanvas, () => { - sp.refreshCanvas(false); - }); - window.subscribe(window.SmartEvent.UI.KeyboardEnable, (tr) => { - sp.keyboardEnable = tr.enable; - if (!sp.keyboardEnable) { - sp.stopWASD(); } - }); - window.subscribe(window.SmartEvent.UI.CollapseAllLane, (collapse: boolean) => { - if (!collapse) { - // 一键折叠之前,记录当前打开的泳道图 - sp.expandRowList = Array.from(sp.rowsEL!.querySelectorAll>(`trace-row[folder][expansion]`)) || []; - } - sp.collapseAll = true; - sp.setAttribute('disable', ''); - sp.expandRowList!.forEach((it) => (it.expansion = collapse)); - sp.collapseAll = false; - sp.removeAttribute('disable'); - sp.refreshCanvas(true); - }); - window.subscribe(window.SmartEvent.UI.MouseEventEnable, (tr) => { - sp.mouseEventEnable = tr.mouseEnable; - if (sp.mouseEventEnable) { - sp.removeAttribute('disable'); - } else { - sp.setAttribute('disable', ''); +} +function smartEventSubscribe(sp: SpSystemTrace) { + window.subscribe(window.SmartEvent.UI.SliceMark, (data) => sp.sliceMarkEventHandler(data)); + window.subscribe(window.SmartEvent.UI.TraceRowComplete, (tr) => {}); + window.subscribe(window.SmartEvent.UI.RefreshCanvas, () => sp.refreshCanvas(false)); + window.subscribe(window.SmartEvent.UI.KeyboardEnable, (tr) => { + sp.keyboardEnable = tr.enable; + if (!sp.keyboardEnable) { + sp.stopWASD(); + } + }); + window.subscribe(window.SmartEvent.UI.CollapseAllLane, (collapse: boolean) => { + if (!collapse) { + // 一键折叠之前,记录当前打开的泳道图 + sp.expandRowList = + Array.from(sp.rowsEL!.querySelectorAll>(`trace-row[folder][expansion]`)) || []; + } + sp.collapseAll = true; + sp.setAttribute('disable', ''); + sp.expandRowList!.forEach((it) => (it.expansion = collapse)); + sp.collapseAll = false; + sp.removeAttribute('disable'); + sp.refreshCanvas(true); + }); + window.subscribe(window.SmartEvent.UI.MouseEventEnable, (tr) => { + sp.mouseEventEnable = tr.mouseEnable; + if (sp.mouseEventEnable) { + sp.removeAttribute('disable'); + } else { + sp.setAttribute('disable', ''); + } + }); + window.subscribe(window.SmartEvent.UI.CollectGroupChange, (group: string) => sp.currentCollectGroup = group); +} +export function SpSystemTraceInitElement(sp:SpSystemTrace){ + window.subscribe(window.SmartEvent.UI.LoadFinishFrame, () => sp.drawAllLines()); + sp.traceSheetEL = sp.shadowRoot?.querySelector('.trace-sheet'); + let rightButton: HTMLElement | null | undefined = sp.traceSheetEL?.shadowRoot + ?.querySelector('#current-selection > tabpane-current-selection') + ?.shadowRoot?.querySelector('#rightButton'); + let rightStar: HTMLElement | null | undefined = sp.traceSheetEL?.shadowRoot + ?.querySelector('#current-selection > tabpane-current-selection') + ?.shadowRoot?.querySelector('#right-star'); + sp.tipEL = sp.shadowRoot?.querySelector('.tip'); + sp.rowsPaneEL = sp.shadowRoot?.querySelector('.rows-pane'); + sp.rowsEL = sp.rowsPaneEL; + sp.spacerEL = sp.shadowRoot?.querySelector('.spacer'); + sp.timerShaftEL = sp.shadowRoot?.querySelector('.timer-shaft'); + sp.favoriteChartListEL = sp.shadowRoot?.querySelector('#favorite-chart-list'); + sp.tabCpuFreq = sp.traceSheetEL?.shadowRoot?.querySelector('tabpane-frequency-sample'); + sp.tabCpuState = sp.traceSheetEL?.shadowRoot?.querySelector('tabpane-counter-sample'); + sp.rangeSelect = new RangeSelect(sp); + rightButton?.addEventListener('click', rightButtonOnClick(sp,rightStar)); + rightStar?.addEventListener('click', rightStarOnClick(sp)); + document?.addEventListener('triangle-flag', triangleFlagHandler(sp)); + document?.addEventListener('number_calibration', numberCalibrationHandler(sp)); + document?.addEventListener('flag-change', flagChangeHandler(sp)); + document?.addEventListener('slices-change', slicesChangeHandler(sp)); + if (sp.timerShaftEL?.collecBtn) { + sp.timerShaftEL.collecBtn.onclick = () => { + if (sp.timerShaftEL!.collecBtn!.hasAttribute('close')) { + sp.timerShaftEL!.collecBtn!.removeAttribute('close'); + sp.favoriteChartListEL?.showCollectArea(); + } else { + sp.timerShaftEL!.collecBtn!.setAttribute('close', ''); + sp.favoriteChartListEL?.hideCollectArea(); + } + }; } - }); - window.subscribe(window.SmartEvent.UI.CollectGroupChange, (group: string) => { - sp.currentCollectGroup = group; - }); + document?.addEventListener('collect', collectHandler(sp)); + SpSystemTrace.scrollViewWidth = sp.getScrollWidth(); + selectHandler(sp); + observerHandler(sp); + window.addEventListener('keydown', windowKeyDownHandler(sp)); + sp.chartManager = new SpChartManager(sp); + sp.canvasPanel = sp.shadowRoot!.querySelector('#canvas-panel')!; + sp.canvasPanelCtx = sp.canvasPanel.getContext('2d'); + sp.canvasFavoritePanelCtx = sp.favoriteChartListEL!.context(); + sp.canvasPanelConfig(); + smartEventSubscribe(sp); } -export function SpSystemTraceShowStruct( - sp: SpSystemTrace, - previous: boolean, - currentIndex: number, - structs: Array, - retargetIndex?: number -) { - if (structs.length == 0) { - return 0; - } - let findIndex = -1; - if (previous) { - if (retargetIndex) { - findIndex = retargetIndex - 1; +export function SpSystemTraceShowStruct(sp:SpSystemTrace,previous: boolean, currentIndex: number, structs: Array, retargetIndex?: number){ + if (structs.length == 0) { + return 0; + } + let findIndex = SpSystemTraceShowStructFindIndex(sp,previous,currentIndex,structs,retargetIndex); + let findEntry: any; + if (findIndex >= 0) { + findEntry = structs[findIndex]; } else { - for (let i = structs.length - 1; i >= 0; i--) { - let it = structs[i]; - if ( - i < currentIndex && - it.startTime! >= TraceRow.range!.startNS && - it.startTime! + it.dur! <= TraceRow.range!.endNS - ) { - findIndex = i; - break; + if (previous) { + for (let i = structs.length - 1; i >= 0; i--) { + let it = structs[i]; + if (it.startTime! + it.dur! < TraceRow.range!.startNS) { + findIndex = i; + break; + } + } + if (findIndex == -1) { + findIndex = structs.length - 1; + } + } else { + findIndex = structs.findIndex((it) => it.startTime! > TraceRow.range!.endNS); + if (findIndex == -1) { + findIndex = 0; + } } - } + findEntry = structs[findIndex]; } - } else { - if (currentIndex == -1) { - findIndex = 0; - } else { - findIndex = structs.findIndex((it, idx) => { - return ( - idx > currentIndex && - it.startTime! >= TraceRow.range!.startNS && - it.startTime! + it.dur! <= TraceRow.range!.endNS - ); - }); + sp.moveRangeToCenter(findEntry.startTime!, findEntry.dur!); + sp.queryAllTraceRow().forEach((item) => { + item.highlight = false; + }); + if (findEntry.type == 'cpu') { + findEntryTypeCpu(sp,findEntry); + } else if (findEntry.type == 'func') { + findEntryTypeFunc(sp,findEntry); + } else if (findEntry.type == 'thread||process') { + findEntryTypeThreadProcess(sp, findEntry); + } else if (findEntry.type == 'sdk') { + findEntryTypeSdk(sp,findEntry); } - } - let findEntry: any; - if (findIndex >= 0) { - findEntry = structs[findIndex]; - } else { + sp.timerShaftEL?.drawTriangle(findEntry.startTime || 0, 'inverted'); + return findIndex; +} +function SpSystemTraceShowStructFindIndex(sp: SpSystemTrace, previous: boolean, currentIndex: number, structs: Array, retargetIndex: number | undefined) { + let findIndex = -1; if (previous) { - for (let i = structs.length - 1; i >= 0; i--) { - let it = structs[i]; - if (it.startTime! + it.dur! < TraceRow.range!.startNS) { - findIndex = i; - break; + if (retargetIndex) { + findIndex = retargetIndex - 1; + } else { + for (let i = structs.length - 1; i >= 0; i--) { + let it = structs[i]; + if ( + i < currentIndex && + it.startTime! >= TraceRow.range!.startNS && + it.startTime! + it.dur! <= TraceRow.range!.endNS + ) { + findIndex = i; + break; + } + } } - } - if (findIndex == -1) { - findIndex = structs.length - 1; - } } else { - findIndex = structs.findIndex((it) => it.startTime! > TraceRow.range!.endNS); - if (findIndex == -1) { - findIndex = 0; - } + if (currentIndex == -1) { + findIndex = 0; + } else { + findIndex = structs.findIndex((it, idx) => { + return ( + idx > currentIndex && + it.startTime! >= TraceRow.range!.startNS && + it.startTime! + it.dur! <= TraceRow.range!.endNS + ); + }); + } } - findEntry = structs[findIndex]; - } - sp.moveRangeToCenter(findEntry.startTime!, findEntry.dur!); - sp.queryAllTraceRow().forEach((item) => { - item.highlight = false; - }); - if (findEntry.type == 'cpu') { + return findIndex; +} +function findEntryTypeCpu(sp: SpSystemTrace, findEntry: any) { CpuStruct.selectCpuStruct = findEntry; CpuStruct.hoverCpuStruct = CpuStruct.selectCpuStruct; sp.queryAllTraceRow(`trace-row[row-type='cpu-data']`, (row) => row.rowType === 'cpu-data').forEach((item) => { - if (item.rowId === `${findEntry.cpu}`) { - sp.rechargeCpuData( - findEntry, - item.dataListCache.find((it) => it.startTime > findEntry.startTime) - ); - item.fixedList = [findEntry]; - } - item.highlight = item.rowId == `${findEntry.cpu}`; - item.draw(true); + if (item.rowId === `${findEntry.cpu}`) { + sp.rechargeCpuData( + findEntry, + item.dataListCache.find((it) => it.startTime > findEntry.startTime) + ); + item.fixedList = [findEntry]; + } + item.highlight = item.rowId == `${findEntry.cpu}`; + item.draw(true); }); sp.scrollToProcess(`${findEntry.cpu}`, '', 'cpu-data', true); sp.onClickHandler(TraceRow.ROW_TYPE_CPU); - } else if (findEntry.type == 'func') { +} +function findEntryTypeFunc(sp: SpSystemTrace, findEntry: any) { sp.observerScrollHeightEnable = true; sp.moveRangeToCenter(findEntry.startTime!, findEntry.dur!); sp.scrollToActFunc( { - startTs: findEntry.startTime, - dur: findEntry.dur, - tid: findEntry.tid, - pid: findEntry.pid, - depth: findEntry.depth, - argsetid: findEntry.argsetid, - funName: findEntry.funName, - cookie: findEntry.cookie, + startTs: findEntry.startTime, + dur: findEntry.dur, + tid: findEntry.tid, + pid: findEntry.pid, + depth: findEntry.depth, + argsetid: findEntry.argsetid, + funName: findEntry.funName, + cookie: findEntry.cookie, }, true ); - } else if (findEntry.type == 'thread||process') { +} +function findEntryTypeThreadProcess(sp: SpSystemTrace, findEntry: any) { let threadProcessRow = sp.rowsEL?.querySelectorAll>('trace-row')[0]; if (threadProcessRow) { - let filterRow = threadProcessRow.childrenList.filter( - (row) => row.rowId === findEntry.rowId && row.rowId === findEntry.rowType - )[0]; - filterRow!.highlight = true; - sp.closeAllExpandRows(findEntry.rowParentId); - sp.scrollToProcess(`${findEntry.rowId}`, `${findEntry.rowParentId}`, findEntry.rowType, true); - let completeEntry = () => { - sp.hoverStructNull(); - sp.selectStructNull(); - sp.wakeupListNull(); + let filterRow = threadProcessRow.childrenList.filter( + (row) => row.rowId === findEntry.rowId && row.rowId === findEntry.rowType + )[0]; + filterRow!.highlight = true; + sp.closeAllExpandRows(findEntry.rowParentId); sp.scrollToProcess(`${findEntry.rowId}`, `${findEntry.rowParentId}`, findEntry.rowType, true); - }; - if (filterRow!.isComplete) { - completeEntry(); - } else { - filterRow!.onComplete = completeEntry; - } + let completeEntry = () => { + sp.hoverStructNull(); + sp.selectStructNull(); + sp.wakeupListNull(); + sp.scrollToProcess(`${findEntry.rowId}`, `${findEntry.rowParentId}`, findEntry.rowType, true); + }; + if (filterRow!.isComplete) { + completeEntry(); + } else { + filterRow!.onComplete = completeEntry; + } } - } else if (findEntry.type == 'sdk') { +} +function findEntryTypeSdk(sp: SpSystemTrace, findEntry: any) { let parentRow = sp.shadowRoot!.querySelector>(`trace-row[row-type='sdk'][folder]`); if (parentRow) { - let sdkRow = parentRow.childrenList.filter( - (child) => child.rowId === findEntry.rowId && child.rowType === findEntry.rowType - )[0]; - sdkRow!.highlight = true; + let sdkRow = parentRow.childrenList.filter( + (child) => child.rowId === findEntry.rowId && child.rowType === findEntry.rowType + )[0]; + sdkRow!.highlight = true; } sp.hoverStructNull(); sp.selectStructNull(); @@ -1329,162 +790,166 @@ export function SpSystemTraceShowStruct( sp.onClickHandler(findEntry.rowType!); sp.closeAllExpandRows(findEntry.rowParentId); sp.scrollToProcess(`${findEntry.rowId}`, `${findEntry.rowParentId}`, findEntry.rowType, true); - } - sp.timerShaftEL?.drawTriangle(findEntry.startTime || 0, 'inverted'); - return findIndex; } -export async function SpSystemTraceInit( - sp: SpSystemTrace, - param: { buf?: ArrayBuffer; url?: string }, - wasmConfigUri: string, - progress: Function -) { - progress('Load database', 6); - sp.rowsPaneEL!.scroll({ - top: 0, - left: 0, - }); - if (param.buf) { - let configJson = ''; - try { - configJson = await fetch(wasmConfigUri).then((res) => res.text()); - } catch (e) { - error('getWasmConfigFailed', e); - } - let parseConfig = FlagsConfig.getSpTraceStreamParseConfig(); - let { status, msg, sdkConfigMap } = await threadPool.initSqlite(param.buf, parseConfig, configJson, progress); - if (!status) { - return { status: false, msg: msg }; +async function SpSystemTraceInitBuffer(sp:SpSystemTrace,param:{buf?:ArrayBuffer;Url?:string},wasmConfigUri:string,progress:Function) { + if (param.buf) { + let configJson = ''; + try { + configJson = await fetch(wasmConfigUri).then((res) => res.text()); + } catch (e) { + error('getWasmConfigFailed', e); + } + let parseConfig = FlagsConfig.getSpTraceStreamParseConfig(); + let { status, msg, sdkConfigMap } = await threadPool.initSqlite(param.buf, parseConfig, configJson, progress); + if (!status) { + return { status: false, msg: msg }; + } + SpSystemTrace.SDK_CONFIG_MAP = sdkConfigMap == undefined ? undefined : sdkConfigMap; + return null + }else{ + return null; } - SpSystemTrace.SDK_CONFIG_MAP = sdkConfigMap == undefined ? undefined : sdkConfigMap; - } - if (param.url) { - let { status, msg } = await threadPool.initServer(param.url, progress); - if (!status) { - return { status: false, msg: msg }; +} +async function SpSystemTraceInitUrl(sp:SpSystemTrace,param: { buf?: ArrayBuffer; url?: string }, wasmConfigUri: string, progress: Function) { + if (param.url) { + let { status, msg } = await threadPool.initServer(param.url, progress); + if (!status) { + return { status: false, msg: msg }; + }else{ + return null; + } + }else{ + return null; } - } - await sp.chartManager?.init(progress); - let rowId: string = ''; - sp.rowsEL?.querySelectorAll>('trace-row').forEach((it: any) => { - if (it.name.includes('Ark Ts')) { - rowId = it.rowId; +} +export async function SpSystemTraceInit(sp:SpSystemTrace,param: { buf?: ArrayBuffer; url?: string }, wasmConfigUri: string, progress: Function) { + progress('Load database', 6); + sp.rowsPaneEL!.scroll({top: 0, left: 0}); + let rsBuf = await SpSystemTraceInitBuffer(sp,param,wasmConfigUri,progress); + if (rsBuf) { + return rsBuf; } - if (it.folder) it.addEventListener('expansion-change', sp.extracted(it)); - }); - progress('completed', 100); - info('All TraceRow Data initialized'); - sp.loadTraceCompleted = true; - sp.rowsEL!.querySelectorAll>('trace-row').forEach((it) => { - if (rowId !== '' && (it.rowId?.includes(rowId) || it.name.includes(rowId))) { - it.addTemplateTypes('Ark Ts'); - for (let child of it.childrenList) { - child.addTemplateTypes('Ark Ts'); - } + let rsUrl = await SpSystemTraceInitUrl(sp,param,wasmConfigUri,progress); + if (rsUrl) { + return rsUrl; } - if (it.folder) { - let offsetYTimeOut: any = undefined; - it.addEventListener('expansion-change', (event: any) => { - let max = [...sp.rowsPaneEL!.querySelectorAll('trace-row')].reduce((pre, cur) => pre + cur.clientHeight!, 0); + await sp.chartManager?.init(progress); + let rowId: string = ''; + sp.rowsEL?.querySelectorAll>('trace-row').forEach((it) => { + if (it.name.includes('Ark Ts')) { + rowId = it.rowId!; + } + if (it.folder) it.addEventListener('expansion-change', sp.extracted(it)); + }); + progress('completed', 100); + info('All TraceRow Data initialized'); + sp.loadTraceCompleted = true; + sp.rowsEL!.querySelectorAll>('trace-row').forEach((it) => { + if (rowId !== '' && (it.rowId?.includes(rowId) || it.name.includes(rowId))) { + it.addTemplateTypes('Ark Ts'); + for (let child of it.childrenList) { + child.addTemplateTypes('Ark Ts'); + } + } + if (it.folder) { + let offsetYTimeOut: any = undefined; + it.addEventListener('expansion-change', expansionChangeHandler(sp,offsetYTimeOut)); + } + if (sp.loadTraceCompleted) { + sp.traceSheetEL?.displaySystemLogsData(); + } + sp.intersectionObserver?.observe(it); + }); + return { status: true, msg: 'success' }; +} +function expansionChangeHandler(sp: SpSystemTrace, offsetYTimeOut: any) { + return function (event: any) { + let max = [...sp.rowsPaneEL!.querySelectorAll('trace-row')].reduce( + (pre, cur) => pre + cur.clientHeight!, 0); let offset = sp.rowsPaneEL!.scrollHeight - max; sp.rowsPaneEL!.scrollTop = sp.rowsPaneEL!.scrollTop - offset; JankStruct.delJankLineFlag = false; if (offsetYTimeOut) { - clearTimeout(offsetYTimeOut); + clearTimeout(offsetYTimeOut); } if (event.detail.expansion) { - offsetYTimeOut = setTimeout(() => { - sp.linkNodes.forEach((linkNode) => { - JankStruct.selectJankStructList?.forEach((selectStruct: any) => { - if (event.detail.rowId == selectStruct.pid) { - JankStruct.selectJankStruct = selectStruct; - JankStruct.hoverJankStruct = selectStruct; - } - }); - if (linkNode[0].rowEL.collect) { - linkNode[0].rowEL.translateY = linkNode[0].rowEL.getBoundingClientRect().top - 195; - } else { - linkNode[0].rowEL.translateY = linkNode[0].rowEL.offsetTop - sp.rowsPaneEL!.scrollTop; - } - linkNode[0].y = linkNode[0].rowEL!.translateY! + linkNode[0].offsetY; - if (linkNode[1].rowEL.collect) { - linkNode[1].rowEL.translateY = linkNode[1].rowEL.getBoundingClientRect().top - 195; - } else { - linkNode[1].rowEL.translateY = linkNode[1].rowEL.offsetTop - sp.rowsPaneEL!.scrollTop; - } - linkNode[1].y = linkNode[1].rowEL!.translateY! + linkNode[1].offsetY; - }); - }, 300); + offsetYTimeOut = setTimeout(() => { + sp.linkNodes.forEach((linkNode) => { + JankStruct.selectJankStructList?.forEach((selectStruct: any) => { + if (event.detail.rowId == selectStruct.pid) { + JankStruct.selectJankStruct = selectStruct; + JankStruct.hoverJankStruct = selectStruct; + } + }); + linkNodeHandler(linkNode, sp); + }); + }, 300); } else { - if (JankStruct!.selectJankStruct) { - JankStruct.selectJankStructList?.push(JankStruct!.selectJankStruct); - } - offsetYTimeOut = setTimeout(() => { - sp.linkNodes?.forEach((linkNode) => { - if (linkNode[0].rowEL.collect) { - linkNode[0].rowEL.translateY = linkNode[0].rowEL.getBoundingClientRect().top - 195; - } else { - linkNode[0].rowEL.translateY = linkNode[0].rowEL.offsetTop - sp.rowsPaneEL!.scrollTop; - } - linkNode[0].y = linkNode[0].rowEL!.translateY! + linkNode[0].offsetY; - if (linkNode[1].rowEL.collect) { - linkNode[1].rowEL.translateY = linkNode[1].rowEL.getBoundingClientRect().top - 195; - } else { - linkNode[1].rowEL.translateY = linkNode[1].rowEL.offsetTop - sp.rowsPaneEL!.scrollTop; - } - linkNode[1].y = linkNode[1].rowEL!.translateY! + linkNode[1].offsetY; - }); - }, 300); + if (JankStruct!.selectJankStruct) { + JankStruct.selectJankStructList?.push(JankStruct!.selectJankStruct); + } + offsetYTimeOut = setTimeout(() => { + sp.linkNodes?.forEach((linkNode) => linkNodeHandler(linkNode, sp)); + }, 300); } let refreshTimeOut = setTimeout(() => { - sp.refreshCanvas(true); - clearTimeout(refreshTimeOut); + sp.refreshCanvas(true); + clearTimeout(refreshTimeOut); }, 360); - }); } - if (sp.loadTraceCompleted) { - sp.traceSheetEL?.displaySystemLogsData(); +} +function linkNodeHandler(linkNode: PairPoint[], sp: SpSystemTrace){ + if (linkNode[0].rowEL.collect) { + linkNode[0].rowEL.translateY = linkNode[0].rowEL.getBoundingClientRect().top - 195; + } else { + linkNode[0].rowEL.translateY = linkNode[0].rowEL.offsetTop - sp.rowsPaneEL!.scrollTop; } - sp.intersectionObserver?.observe(it); - }); - return { status: true, msg: 'success' }; + linkNode[0].y = linkNode[0].rowEL!.translateY! + linkNode[0].offsetY; + if (linkNode[1].rowEL.collect) { + linkNode[1].rowEL.translateY = linkNode[1].rowEL.getBoundingClientRect().top - 195; + } else { + linkNode[1].rowEL.translateY = linkNode[1].rowEL.offsetTop - sp.rowsPaneEL!.scrollTop; + } + linkNode[1].y = linkNode[1].rowEL!.translateY! + linkNode[1].offsetY; } -export function SpSystemTraceInitPointToEvent(sp: SpSystemTrace) { - sp.eventMap = { + +const eventMap = { 'cpu-data': 'Cpu', 'cpu-state': 'Cpu State', 'cpu-freq': 'Cpu Frequency', 'cpu-limit-freq': 'Cpu Freq Limit', - process: 'Process', + 'process': 'Process', 'native-memory': 'Native Memory', - thread: 'Thread', - func: 'Func', - mem: 'Memory', + 'thread': 'Thread', + 'func': 'Func', + 'mem': 'Memory', 'virtual-memory-cell': 'Virtual Memory', 'virtual-memory-group': 'Virtual Memory', - fps: 'FPS', + 'fps': 'FPS', 'ability-monitor': 'Ability Monitor', 'cpu-ability': 'Cpu Ability', 'memory-ability': 'Memory Ability', 'disk-ability': 'DiskIO Ability', 'network-ability': 'Network Ability', - sdk: 'Sdk', + 'sdk': 'Sdk', 'sdk-counter': 'SDK Counter', 'sdk-slice': 'Sdk Slice', - energy: 'Energy', + 'energy': 'Energy', 'power-energy': 'Power Event', 'system-energy': 'System Event', 'anomaly-energy': 'Anomaly Event', 'clock-group': 'Clocks', - clock: 'clock', + 'clock': 'clock', 'irq-group': 'Irqs', - irq: 'irq', - hiperf: 'HiPerf (All)', + 'irq': 'irq', + 'hiperf': 'HiPerf (All)', 'hiperf-event': 'HiPerf Event', 'hiperf-report': 'HiPerf Report', 'hiperf-process': 'HiPerf Process', 'hiperf-thread': 'HiPerf Thread', 'js-memory': 'Js Memory', - }; } +export function SpSystemTraceInitPointToEvent(sp: SpSystemTrace) { + sp.eventMap = eventMap; +} \ No newline at end of file diff --git a/ide/src/trace/component/SpSystemTrace.line.ts b/ide/src/trace/component/SpSystemTrace.line.ts index a4807eb9..7f74c98a 100644 --- a/ide/src/trace/component/SpSystemTrace.line.ts +++ b/ide/src/trace/component/SpSystemTrace.line.ts @@ -24,12 +24,220 @@ import { queryTaskPoolOtherRelationData, queryTaskPoolRelationData } from '../da import { queryBySelectAllocationOrReturn } from '../database/sql/SqlLite.sql'; import { ThreadStruct } from '../database/ui-worker/ProcedureWorkerThread'; -export function SpSystemTraceDrawJankLine( +function collectionHasJank(jankRow: any, collectList: TraceRow[]): boolean { + for (let item of collectList!) { + if (item.rowId === jankRow.rowId && item.rowType === jankRow.rowType) { + return false; + } + } + return true; +} + +function setPoint( + x: number, + y: number, + offsetY: number, + ns: number, + rowEL: any, + isRight: boolean, + business: string +): any { + return { + x: x, + y: y, + offsetY: offsetY, + ns: ns, + rowEL: rowEL!, + isRight: isRight, + business: business, + }; +} + +function selectJankApp( + endParentRow: any, + sp: SpSystemTrace, + data: any, + startRow: any, + selectJankStruct: JankStruct, + endRowStruct: any +): void { + let collectList = sp.favoriteChartListEL!.getAllCollectRows(); + let findJankEntry = endRowStruct!.dataListCache!.find((dat: any) => dat.name == data.name && dat.pid == data.pid); + let tts = + findJankEntry.frame_type == 'frameTime' ? selectJankStruct.ts! : selectJankStruct.ts! + selectJankStruct.dur!; + let startParentRow: any; + // startRow为子泳道,子泳道不存在,使用父泳道 + if (startRow) { + startParentRow = sp.shadowRoot?.querySelector>( + `trace-row[row-id='${startRow.rowParentId}'][folder]` + ); + } else { + startRow = sp.shadowRoot?.querySelector>( + `trace-row[row-id='${selectJankStruct?.pid}'][folder]` + ); + } + let endY = endRowStruct!.translateY! + 20 * (findJankEntry!.depth! + 0.5); + let endRowEl = endRowStruct; + let endOffSetY = 20 * (findJankEntry!.depth! + 0.5); + let expansionFlag = collectionHasJank(endRowStruct, collectList); + if (!endParentRow.expansion && expansionFlag) { + endY = endParentRow!.translateY! + 10 * (findJankEntry!.depth! + 0.5); + endRowEl = endParentRow; + endOffSetY = 10 * (findJankEntry!.depth! + 0.5); + } + let startY = startRow!.translateY! + 20 * (selectJankStruct!.depth! + 0.5); + let startRowEl = startRow; + let startOffSetY = 20 * (selectJankStruct!.depth! + 0.5); + expansionFlag = collectionHasJank(startRow, collectList); + if (startParentRow && !startParentRow.expansion && expansionFlag) { + startY = startParentRow!.translateY! + 10 * (selectJankStruct!.depth! + 0.5); + startRowEl = startParentRow; + startOffSetY = 10 * (selectJankStruct!.depth! + 0.5); + } + let startX = ns2xByTimeShaft(tts, sp.timerShaftEL!); + let endX = ns2xByTimeShaft(findJankEntry.ts!, sp.timerShaftEL!); + const startPoint = setPoint(startX, startY, startOffSetY, tts, startRowEl, selectJankStruct.ts == tts, 'janks'); + const endPoint = setPoint(endX, endY, endOffSetY, findJankEntry.ts!, endRowEl, true, 'janks'); + sp.addPointPair(startPoint, endPoint); +} + +function findJankApp( + endParentRow: any, + sp: SpSystemTrace, + data: any, + startRow: any, + selectJankStruct: JankStruct, + endRowStruct: any +): void { + let collectList = sp.favoriteChartListEL!.getAllCollectRows(); + let findJankEntry = endRowStruct!.dataListCache!.find((dat: any) => dat.name == data.name && dat.pid == data.pid); + let tts = selectJankStruct.frame_type == 'frameTime' ? findJankEntry.ts : findJankEntry.ts! + findJankEntry.dur!; + let endY = endRowStruct!.translateY! + 20 * (findJankEntry!.depth! + 0.5); + let endRowEl = endRowStruct; + let endOffSetY = 20 * (findJankEntry!.depth! + 0.5); + let expansionFlag = collectionHasJank(endRowStruct, collectList); + if (!endParentRow.expansion && expansionFlag) { + endY = endParentRow!.translateY! + 10 * (findJankEntry!.depth! + 0.5); + endRowEl = endParentRow; + endOffSetY = 10 * (findJankEntry!.depth! + 0.5); + } + let startY = startRow!.translateY! + 20 * (selectJankStruct!.depth! + 0.5); + let startRowEl = startRow; + expansionFlag = collectionHasJank(startRow, collectList); + let startOffsetY = 20 * (selectJankStruct!.depth! + 0.5); + let startParentRow = sp.shadowRoot?.querySelector>( + `trace-row[row-id='${startRow.rowParentId}'][folder]` + ); + if (startParentRow && !startParentRow.expansion && expansionFlag) { + startY = startParentRow!.translateY! + 10 * (selectJankStruct!.depth! + 0.5); + startRowEl = startParentRow; + startOffsetY = 10 * (selectJankStruct!.depth! + 0.5); + } + let startX = ns2xByTimeShaft(selectJankStruct.ts!, sp.timerShaftEL!); + let endX = ns2xByTimeShaft(tts, sp.timerShaftEL!); + const startPoint = setPoint(startX, startY, startOffsetY, selectJankStruct.ts!, startRowEl, true, 'janks'); + const endPoint = setPoint(endX, endY, endOffSetY, tts, endRowEl, selectJankStruct.ts == tts, 'janks'); + sp.addPointPair(startPoint, endPoint); +} + +function addPointLink( + endParentRow: any, + sp: SpSystemTrace, + data: any, + startRow: any, + selectJankStruct: JankStruct, + endRowStruct: any +): void { + let findJankEntry = endRowStruct!.dataListCache!.find((dat: any) => dat.name == data.name && dat.pid == data.pid); + //连线规则:frametimeline的头----app的头,app的尾----renderservice的头 + let tts: number = 0; + if (findJankEntry) { + if (selectJankStruct.frame_type == 'app') { + selectJankApp(endParentRow, sp, data, startRow, selectJankStruct, endRowStruct); + } + if (findJankEntry.frame_type == 'app') { + findJankApp(endParentRow, sp, data, startRow, selectJankStruct, endRowStruct); + } + if (data.children.length >= 1) { + let endP; + if (data.children[0].frame_type == 'frameTime') { + endP = sp.shadowRoot?.querySelector>("trace-row[row-id='frameTime']"); + } else { + endP = sp.shadowRoot?.querySelector>(`trace-row[row-id='${data.children[0].pid}'][folder]`); + } + sp.drawJankLine(endP, findJankEntry, data.children[0]); + } + } +} + +function getEndStruct(data: any, sp: SpSystemTrace): any { + let endRowStruct: any; + if (data.frame_type == 'frameTime') { + endRowStruct = sp.shadowRoot?.querySelector>( + "trace-row[row-id='actual frameTime'][row-type='janks']" + ); + } else { + endRowStruct = sp.shadowRoot?.querySelector>( + `trace-row[row-id='${data.type}-${data.pid}'][row-type='janks']` + ); + } + return endRowStruct; +} + +function drawJankLineEndParent( + endParentRow: any, + sp: SpSystemTrace, + data: any, + startRow: any, + selectJankStruct: JankStruct +): void { + endParentRow.expansion = true; + //终点的父泳道过滤出选中的Struct + let endRowStruct = getEndStruct(data, sp); + //泳道未展开的情况,查找endRowStruct + if (!endRowStruct) { + if (data.frame_type == 'frameTime') { + endParentRow.childrenList.forEach((item: TraceRow) => { + if (item.rowId === 'actual frameTime' && item.rowType === 'janks') { + endRowStruct = item; + } + }); + //frameTime未展开 + if (!endRowStruct) { + endParentRow = sp.shadowRoot?.querySelector>("trace-row[row-id='frameTime'][folder]"); + endParentRow?.childrenList?.forEach((item: TraceRow) => { + if (item.rowId === 'actual frameTime' && item.rowType === 'janks') { + endRowStruct = item; + } + }); + } + } else { + endParentRow.childrenList.forEach((item: TraceRow) => { + if (item.name.startsWith('Actual Timeline') && item.rowType === 'janks') { + endRowStruct = item; + } + }); + } + } + if (endRowStruct) { + if (endRowStruct.isComplete) { + addPointLink(endParentRow, sp, data, startRow, selectJankStruct, endRowStruct); + } else { + endRowStruct.supplierFrame!().then((res: any) => { + endRowStruct.dataListCache = res; + endRowStruct.loadingFrame = false; + addPointLink(endParentRow, sp, data, startRow, selectJankStruct, endRowStruct); + }); + } + } +} + +export function spSystemTraceDrawJankLine( sp: SpSystemTrace, endParentRow: any, selectJankStruct: JankStruct, data: any -) { +): void { let collectList = sp.favoriteChartListEL!.getAllCollectRows(); let startRow: any; if (selectJankStruct == undefined || selectJankStruct == null) { @@ -54,184 +262,166 @@ export function SpSystemTraceDrawJankLine( } } } + if (endParentRow) { + drawJankLineEndParent(endParentRow, sp, data, startRow, selectJankStruct); + } +} - function collectionHasJank(jankRow: any): boolean { - for (let item of collectList!) { - if (item.rowId === jankRow.rowId && item.rowType === jankRow.rowType) { - return false; - } +function taskPoolOtherRelationData( + selectRow: any, + sp: SpSystemTrace, + row: TraceRow, + relationDataList: FuncStruct[], + res: any +): void { + selectRow!.fixedList = relationDataList; + relationDataList.forEach((value) => { + TabPaneTaskFrames.TaskArray.push(value); + // allocation to execute + const selectY = (FuncStruct.selectFuncStruct!.depth! + 0.5) * 20; + const offSetY = (value.depth! + 0.5) * 20; + const selectRowY = selectRow?.translateY!; + const selectStartTs = FuncStruct.selectFuncStruct!.startTs!; + const selectDur = FuncStruct.selectFuncStruct!.dur!; + + if (value.id === res[0].allocation_task_row) { + sp.addPointPair( + sp.makePoint(value.startTs!, 0, selectRowY, selectRow, offSetY, 'task', LineType.bezierCurve, true), + sp.makePoint(selectStartTs, 0, row?.translateY!, row, selectY, 'task', LineType.bezierCurve, true) + ); + } else { + sp.addPointPair( + sp.makePoint(selectStartTs, selectDur, row?.translateY!, row, selectY, 'task', LineType.bezierCurve, false), + sp.makePoint(value.startTs!, value.dur!, selectRowY, selectRow, offSetY, 'task', LineType.bezierCurve, false) + ); } - return true; - } - if (endParentRow) { - endParentRow.expansion = true; - //终点的父泳道过滤出选中的Struct - let endRowStruct: any; - //泳道展开的情况,查找endRowStruct - if (data.frame_type == 'frameTime') { - endRowStruct = sp.shadowRoot?.querySelector>( - "trace-row[row-id='actual frameTime'][row-type='janks']" + }); + sp.refreshCanvas(true); +} + +function taskPoolRelationDataAllocation( + executeRow: TraceRow | null | undefined, + sp: SpSystemTrace, + row: TraceRow, + relationDataList: FuncStruct[], + res: any +): void { + let executeStruct = relationDataList.filter((item) => item.id === res[0].execute_task_row)[0]; + relationDataList.forEach((value) => { + const selectY = (FuncStruct.selectFuncStruct!.depth! + 0.5) * 20; + const offSetY = (value.depth! + 0.5) * 20; + const executeRowY = executeRow?.translateY!; + const selectStartTs = FuncStruct.selectFuncStruct!.startTs!; + const executeY = (executeStruct.depth! + 0.5) * 20; + TabPaneTaskFrames.TaskArray.push(value); + if (value.id === res[0].execute_task_row) { + sp.addPointPair( + sp.makePoint(selectStartTs, 0, row?.translateY!, row, selectY, 'task', LineType.bezierCurve, true), + sp.makePoint(value.startTs!, 0, executeRowY, executeRow, offSetY, 'task', LineType.bezierCurve, true) ); } else { - endRowStruct = sp.shadowRoot?.querySelector>( - `trace-row[row-id='${data.type}-${data.pid}'][row-type='janks']` + sp.addPointPair( + sp.makePoint( + executeStruct.startTs!, + executeStruct.dur!, + executeRowY, + executeRow, + executeY, + 'task', + LineType.bezierCurve, + false + ), + sp.makePoint(value.startTs!, value.dur!, row?.translateY!, row, offSetY, 'task', LineType.bezierCurve, false) ); } - //泳道未展开的情况,查找endRowStruct - if (!endRowStruct) { - if (data.frame_type == 'frameTime') { - endParentRow.childrenList.forEach((item: TraceRow) => { - if (item.rowId === 'actual frameTime' && item.rowType === 'janks') { - endRowStruct = item; - } - }); - //frameTime未展开 - if (!endRowStruct) { - endParentRow = sp.shadowRoot?.querySelector>("trace-row[row-id='frameTime'][folder]"); - endParentRow?.childrenList?.forEach((item: TraceRow) => { - if (item.rowId === 'actual frameTime' && item.rowType === 'janks') { - endRowStruct = item; - } - }); - } - } else { - endParentRow.childrenList.forEach((item: TraceRow) => { - if (item.name.startsWith('Actual Timeline') && item.rowType === 'janks') { - endRowStruct = item; - } - }); - } + }); +} + +function taskPoolRelationDataPerformTask( + executeRow: TraceRow | null | undefined, + sp: SpSystemTrace, + row: TraceRow, + relationDataList: FuncStruct[], + res: any +): void { + let executeStruct = relationDataList.filter((item) => item.id === res[0].execute_task_row)[0]; + relationDataList.forEach((value) => { + const executeRowY = executeRow?.translateY!; + const selectStartTs = FuncStruct.selectFuncStruct!.startTs!; + const executeY = (executeStruct.depth! + 0.5) * 20; + const selectY = (FuncStruct.selectFuncStruct!.depth! + 0.5) * 20; + const offSetY = (value.depth! + 0.5) * 20; + TabPaneTaskFrames.TaskArray.push(value); + if (value.id === res[0].execute_task_row) { + sp.addPointPair( + sp.makePoint( + selectStartTs, + FuncStruct.selectFuncStruct!.dur!, + row?.translateY!, + row, + selectY, + 'task', + LineType.bezierCurve, + false + ), + sp.makePoint(value.startTs!, value.dur!, executeRowY, executeRow, offSetY, 'task', LineType.bezierCurve, false) + ); + } else { + sp.addPointPair( + sp.makePoint(executeStruct.startTs!, 0, executeRowY, executeRow, executeY, 'task', LineType.bezierCurve, true), + sp.makePoint(value.startTs!, 0, row?.translateY!, row, offSetY, 'task', LineType.bezierCurve, true) + ); } - let addPointLink = () => { - let findJankEntry = endRowStruct!.dataListCache!.find((dat: any) => dat.name == data.name && dat.pid == data.pid); - //连线规则:frametimeline的头----app的头,app的尾----renderservice的头 - let tts: number = 0; - if (findJankEntry) { - if (selectJankStruct.frame_type == 'app') { - tts = - findJankEntry.frame_type == 'frameTime' - ? selectJankStruct.ts! - : selectJankStruct.ts! + selectJankStruct.dur!; - let startParentRow: any; - // startRow为子泳道,子泳道不存在,使用父泳道 - if (startRow) { - startParentRow = sp.shadowRoot?.querySelector>( - `trace-row[row-id='${startRow.rowParentId}'][folder]` - ); - } else { - startRow = sp.shadowRoot?.querySelector>( - `trace-row[row-id='${selectJankStruct?.pid}'][folder]` - ); - } - let endY = endRowStruct!.translateY! + 20 * (findJankEntry!.depth! + 0.5); - let endRowEl = endRowStruct; - let endOffSetY = 20 * (findJankEntry!.depth! + 0.5); - let expansionFlag = collectionHasJank(endRowStruct); - if (!endParentRow.expansion && expansionFlag) { - endY = endParentRow!.translateY! + 10 * (findJankEntry!.depth! + 0.5); - endRowEl = endParentRow; - endOffSetY = 10 * (findJankEntry!.depth! + 0.5); - } - let startY = startRow!.translateY! + 20 * (selectJankStruct!.depth! + 0.5); - let startRowEl = startRow; - let startOffSetY = 20 * (selectJankStruct!.depth! + 0.5); - expansionFlag = collectionHasJank(startRow); - if (startParentRow && !startParentRow.expansion && expansionFlag) { - startY = startParentRow!.translateY! + 10 * (selectJankStruct!.depth! + 0.5); - startRowEl = startParentRow; - startOffSetY = 10 * (selectJankStruct!.depth! + 0.5); - } - sp.addPointPair( - { - x: ns2xByTimeShaft(tts, sp.timerShaftEL!), - y: startY, - offsetY: startOffSetY, - ns: tts, - rowEL: startRowEl!, - isRight: selectJankStruct.ts == tts, - business: 'janks', - }, - { - x: ns2xByTimeShaft(findJankEntry.ts!, sp.timerShaftEL!), - y: endY, - offsetY: endOffSetY, - ns: findJankEntry.ts!, - rowEL: endRowEl, - isRight: true, - business: 'janks', - } - ); - } - if (findJankEntry.frame_type == 'app') { - tts = selectJankStruct.frame_type == 'frameTime' ? findJankEntry.ts : findJankEntry.ts! + findJankEntry.dur!; - let endY = endRowStruct!.translateY! + 20 * (findJankEntry!.depth! + 0.5); - let endRowEl = endRowStruct; - let endOffSetY = 20 * (findJankEntry!.depth! + 0.5); - let expansionFlag = collectionHasJank(endRowStruct); - if (!endParentRow.expansion && expansionFlag) { - endY = endParentRow!.translateY! + 10 * (findJankEntry!.depth! + 0.5); - endRowEl = endParentRow; - endOffSetY = 10 * (findJankEntry!.depth! + 0.5); - } - let startY = startRow!.translateY! + 20 * (selectJankStruct!.depth! + 0.5); - let startRowEl = startRow; - expansionFlag = collectionHasJank(startRow); - let startOffsetY = 20 * (selectJankStruct!.depth! + 0.5); - let startParentRow = sp.shadowRoot?.querySelector>( - `trace-row[row-id='${startRow.rowParentId}'][folder]` - ); - if (startParentRow && !startParentRow.expansion && expansionFlag) { - startY = startParentRow!.translateY! + 10 * (selectJankStruct!.depth! + 0.5); - startRowEl = startParentRow; - startOffsetY = 10 * (selectJankStruct!.depth! + 0.5); - } - sp.addPointPair( - { - x: ns2xByTimeShaft(selectJankStruct.ts!, sp.timerShaftEL!), - y: startY, - offsetY: startOffsetY, - ns: selectJankStruct.ts!, - rowEL: startRowEl!, - isRight: true, - business: 'janks', - }, - { - x: ns2xByTimeShaft(tts, sp.timerShaftEL!), - y: endY, - offsetY: endOffSetY, - ns: tts, - rowEL: endRowEl!, - isRight: selectJankStruct.ts == tts, - business: 'janks', - } - ); - } - if (data.children.length >= 1) { - let endP; - if (data.children[0].frame_type == 'frameTime') { - endP = sp.shadowRoot?.querySelector>("trace-row[row-id='frameTime']"); - } else { - endP = sp.shadowRoot?.querySelector>(`trace-row[row-id='${data.children[0].pid}'][folder]`); - } - sp.drawJankLine(endP, findJankEntry, data.children[0]); - } + }); + sp.refreshCanvas(true); +} + +function taskAllocationOrPerformTask(sp: SpSystemTrace, row: TraceRow, executeID: string): void { + TabPaneTaskFrames.IsShowConcurrency = false; + queryBySelectAllocationOrReturn(executeID, FuncStruct.selectFuncStruct!.itid!).then((res) => { + if (FuncStruct.selectFuncStruct!.funName!.indexOf('H:Task Allocation:') >= 0 && res.length > 0) { + let executeRow = sp.shadowRoot?.querySelector>( + `trace-row[row-id='${res[0].tid}'][row-type='func']` + ); + if (!executeRow) { + return; } - }; - if (endRowStruct) { - if (endRowStruct.isComplete) { - addPointLink(); - } else { - endRowStruct.supplierFrame!().then((res: any) => { - endRowStruct.dataListCache = res; - endRowStruct.loadingFrame = false; - addPointLink(); - }); + let idList: number[] = []; + let tidList: number[] = []; + if (res[0].execute_task_row) { + idList.push(res[0].execute_task_row); + tidList.push(Number(res[0].tid)); + } + if (res[0].return_task_row) { + idList.push(res[0].return_task_row); + tidList.push(Number(row.rowId)); + } + queryTaskPoolRelationData(idList, tidList).then((relationDataList) => { + taskPoolRelationDataAllocation(executeRow, sp, row, relationDataList, res); + }); + } else if (FuncStruct.selectFuncStruct!.funName!.indexOf('H:Task PerformTask End:') >= 0) { + let executeRow = sp.shadowRoot?.querySelector>( + `trace-row[row-id='${res[0].tid}'][row-type='func']` + ); + TabPaneTaskFrames.TaskArray.push(FuncStruct.selectFuncStruct!); + let idList: number[] = []; + let tidList: number[] = []; + if (res[0].execute_task_row) { + idList.push(res[0].execute_task_row); + tidList.push(Number(res[0].tid)); } + if (res[0].allocation_task_row) { + idList.push(res[0].allocation_task_row); + tidList.push(Number(row.rowId)); + } + queryTaskPoolRelationData(idList, tidList).then((relationDataList) => { + taskPoolRelationDataPerformTask(executeRow, sp, row, relationDataList, res); + }); } - } + }); } -export function SpSystemTraceDrawTaskPollLine(sp: SpSystemTrace, row?: TraceRow) { +export function SpSystemTraceDrawTaskPollLine(sp: SpSystemTrace, row?: TraceRow): void { let executeID = TabPaneTaskFrames.getExecuteId(FuncStruct.selectFuncStruct!.funName!); TabPaneTaskFrames.TaskArray.push(FuncStruct.selectFuncStruct!); if (!row) { @@ -262,232 +452,23 @@ export function SpSystemTraceDrawTaskPollLine(sp: SpSystemTrace, row?: TraceRow< idList.push(res[0].return_task_row); } queryTaskPoolOtherRelationData(idList, allocationRowId).then((relationDataList) => { - selectRow!.fixedList = relationDataList; - selectRow!.fixedList.forEach((value) => { - TabPaneTaskFrames.TaskArray.push(value); - // allocation to execute - if (value.id === res[0].allocation_task_row) { - sp.addPointPair( - sp.makePoint( - value.startTs!, - 0, - selectRow?.translateY!, - selectRow, - (value.depth! + 0.5) * 20, - 'task', - LineType.bezierCurve, - true - ), - sp.makePoint( - FuncStruct.selectFuncStruct!.startTs!, - 0, - row?.translateY!, - row, - (FuncStruct.selectFuncStruct!.depth! + 0.5) * 20, - 'task', - LineType.bezierCurve, - true - ) - ); - } else { - sp.addPointPair( - sp.makePoint( - FuncStruct.selectFuncStruct!.startTs!, - FuncStruct.selectFuncStruct!.dur!, - row?.translateY!, - row, - (FuncStruct.selectFuncStruct!.depth! + 0.5) * 20, - 'task', - LineType.bezierCurve, - false - ), - sp.makePoint( - value.startTs!, - value.dur!, - selectRow?.translateY!, - selectRow, - (value.depth! + 0.5) * 20, - 'task', - LineType.bezierCurve, - false - ) - ); - } - }); - sp.refreshCanvas(true); + taskPoolOtherRelationData(selectRow, sp, row, relationDataList, res); }); } }); } else { - TabPaneTaskFrames.IsShowConcurrency = false; - queryBySelectAllocationOrReturn(executeID, FuncStruct.selectFuncStruct!.itid!).then((res) => { - if (FuncStruct.selectFuncStruct!.funName!.indexOf('H:Task Allocation:') >= 0 && res.length > 0) { - let executeRow = sp.shadowRoot?.querySelector>( - `trace-row[row-id='${res[0].tid}'][row-type='func']` - ); - if (!executeRow) { - return; - } - let idList: number[] = []; - let tidList: number[] = []; - if (res[0].execute_task_row) { - idList.push(res[0].execute_task_row); - tidList.push(Number(res[0].tid)); - } - if (res[0].return_task_row) { - idList.push(res[0].return_task_row); - tidList.push(Number(row.rowId)); - } - queryTaskPoolRelationData(idList, tidList).then((relationDataList) => { - let executeStruct = relationDataList.filter((item) => item.id === res[0].execute_task_row)[0]; - relationDataList.forEach((value) => { - TabPaneTaskFrames.TaskArray.push(value); - if (value.id === res[0].execute_task_row) { - sp.addPointPair( - sp.makePoint( - FuncStruct.selectFuncStruct!.startTs!, - 0, - row?.translateY!, - row, - (FuncStruct.selectFuncStruct!.depth! + 0.5) * 20, - 'task', - LineType.bezierCurve, - true - ), - sp.makePoint( - value.startTs!, - 0, - executeRow?.translateY!, - executeRow, - (value.depth! + 0.5) * 20, - 'task', - LineType.bezierCurve, - true - ) - ); - } else { - sp.addPointPair( - sp.makePoint( - executeStruct.startTs!, - executeStruct.dur!, - executeRow?.translateY!, - executeRow, - (executeStruct.depth! + 0.5) * 20, - 'task', - LineType.bezierCurve, - false - ), - sp.makePoint( - value.startTs!, - value.dur!, - row?.translateY!, - row, - (value.depth! + 0.5) * 20, - 'task', - LineType.bezierCurve, - false - ) - ); - } - }); - }); - } else if (FuncStruct.selectFuncStruct!.funName!.indexOf('H:Task PerformTask End:') >= 0) { - let executeRow = sp.shadowRoot?.querySelector>( - `trace-row[row-id='${res[0].tid}'][row-type='func']` - ); - TabPaneTaskFrames.TaskArray.push(FuncStruct.selectFuncStruct!); - let idList: number[] = []; - let tidList: number[] = []; - if (res[0].execute_task_row) { - idList.push(res[0].execute_task_row); - tidList.push(Number(res[0].tid)); - } - if (res[0].allocation_task_row) { - idList.push(res[0].allocation_task_row); - tidList.push(Number(row.rowId)); - } - queryTaskPoolRelationData(idList, tidList).then((relationDataList) => { - let executeStruct = relationDataList.filter((item) => item.id === res[0].execute_task_row)[0]; - relationDataList.forEach((value) => { - TabPaneTaskFrames.TaskArray.push(value); - if (value.id === res[0].execute_task_row) { - sp.addPointPair( - sp.makePoint( - FuncStruct.selectFuncStruct!.startTs!, - FuncStruct.selectFuncStruct!.dur!, - row?.translateY!, - row, - (FuncStruct.selectFuncStruct!.depth! + 0.5) * 20, - 'task', - LineType.bezierCurve, - false - ), - sp.makePoint( - value.startTs!, - value.dur!, - executeRow?.translateY!, - executeRow, - (value.depth! + 0.5) * 20, - 'task', - LineType.bezierCurve, - false - ) - ); - } else { - sp.addPointPair( - sp.makePoint( - executeStruct.startTs!, - 0, - executeRow?.translateY!, - executeRow, - (executeStruct.depth! + 0.5) * 20, - 'task', - LineType.bezierCurve, - true - ), - sp.makePoint( - value.startTs!, - 0, - row?.translateY!, - row, - (value.depth! + 0.5) * 20, - 'task', - LineType.bezierCurve, - true - ) - ); - } - }); - sp.refreshCanvas(true); - }); - } - }); + taskAllocationOrPerformTask(sp, row, executeID); } } -export function SpSystemTraceDrawThreadLine( +function jankPoint( + endRowStruct: any, + data: any, sp: SpSystemTrace, - endParentRow: any, - selectThreadStruct: ThreadStruct | undefined, - data: any -) { - const collectList = sp.favoriteChartListEL!.getCollectRows(); - if (!selectThreadStruct) { - return; - } - const selectRowId = selectThreadStruct?.tid; - let startRow = sp.getStartRow(selectRowId, collectList); - if (!endParentRow) { - return; - } - let endRowStruct: any = sp.shadowRoot?.querySelector>( - `trace-row[row-id='${data.tid}'][row-type='thread']` - ); - if (!endRowStruct) { - endRowStruct = endParentRow.childrenList.find((item: TraceRow) => { - return item.rowId === `${data.tid}` && item.rowType === 'thread'; - }); - } + selectThreadStruct: ThreadStruct, + startRow: any, + endParentRow: any +): void { if (endRowStruct) { let findJankEntry = endRowStruct!.dataListCache!.find( (dat: any) => dat.startTime == data.startTime && dat.dur! > 0 @@ -523,3 +504,29 @@ export function SpSystemTraceDrawThreadLine( } } } + +export function spSystemTraceDrawThreadLine( + sp: SpSystemTrace, + endParentRow: any, + selectThreadStruct: ThreadStruct | undefined, + data: any +): void { + const collectList = sp.favoriteChartListEL!.getCollectRows(); + if (!selectThreadStruct) { + return; + } + const selectRowId = selectThreadStruct?.tid; + let startRow = sp.getStartRow(selectRowId, collectList); + if (!endParentRow) { + return; + } + let endRowStruct: any = sp.shadowRoot?.querySelector>( + `trace-row[row-id='${data.tid}'][row-type='thread']` + ); + if (!endRowStruct) { + endRowStruct = endParentRow.childrenList.find((item: TraceRow) => { + return item.rowId === `${data.tid}` && item.rowType === 'thread'; + }); + } + jankPoint(endParentRow, data, sp, selectThreadStruct, startRow, endParentRow); +} diff --git a/ide/src/trace/component/SpSystemTrace.ts b/ide/src/trace/component/SpSystemTrace.ts index 90008c3d..3e92c8ad 100644 --- a/ide/src/trace/component/SpSystemTrace.ts +++ b/ide/src/trace/component/SpSystemTrace.ts @@ -104,9 +104,9 @@ import { SpSystemTraceShowStruct, } from './SpSystemTrace.init'; import { - SpSystemTraceDrawJankLine, + spSystemTraceDrawJankLine, SpSystemTraceDrawTaskPollLine, - SpSystemTraceDrawThreadLine, + spSystemTraceDrawThreadLine, } from './SpSystemTrace.line'; import SpSystemTraceOnClickHandler, { SpSystemTraceDocumentOnClick, @@ -558,21 +558,7 @@ export class SpSystemTrace extends BaseElement { this.drawAllLines(); } - drawAllLines(): void { - // draw flag line segment for canvas - drawFlagLineSegment( - this.canvasPanelCtx, - this.hoverFlag, - this.selectFlag, - { - x: 0, - y: 0, - width: this.timerShaftEL?.canvas?.clientWidth, - height: this.canvasPanel?.clientHeight, - }, - this.timerShaftEL! - ); - this.favoriteChartListEL?.drawFlagLineSegment(this.hoverFlag, this.selectFlag, this.timerShaftEL!); + drawWakeUpLine(): void { //draw wakeup for main canvas drawWakeUp( this.canvasPanelCtx, @@ -608,6 +594,24 @@ export class SpSystemTrace extends BaseElement { ); this.favoriteChartListEL?.drawWakeUpList(SpSystemTrace.wakeupList[i + 1]); } + } + + drawAllLines(): void { + // draw flag line segment for canvas + drawFlagLineSegment( + this.canvasPanelCtx, + this.hoverFlag, + this.selectFlag, + { + x: 0, + y: 0, + width: this.timerShaftEL?.canvas?.clientWidth, + height: this.canvasPanel?.clientHeight, + }, + this.timerShaftEL! + ); + this.favoriteChartListEL?.drawFlagLineSegment(this.hoverFlag, this.selectFlag, this.timerShaftEL!); + this.drawWakeUpLine(); //draw system logs line segment for canvas drawLogsLineSegment( this.canvasPanelCtx, @@ -745,78 +749,31 @@ export class SpSystemTrace extends BaseElement { } } - setSLiceMark(shiftKey: boolean): SlicesTime | null | undefined { - if (CpuStruct.selectCpuStruct) { - this.slicestime = this.timerShaftEL?.setSlicesMark( - CpuStruct.selectCpuStruct.startTime || 0, - (CpuStruct.selectCpuStruct.startTime || 0) + (CpuStruct.selectCpuStruct.dur || 0), - shiftKey - ); - } else if (ThreadStruct.selectThreadStruct) { - this.slicestime = this.timerShaftEL?.setSlicesMark( - ThreadStruct.selectThreadStruct.startTime || 0, - (ThreadStruct.selectThreadStruct.startTime || 0) + (ThreadStruct.selectThreadStruct.dur || 0), - shiftKey - ); - } else if (FuncStruct.selectFuncStruct) { - this.slicestime = this.timerShaftEL?.setSlicesMark( - FuncStruct.selectFuncStruct.startTs || 0, - (FuncStruct.selectFuncStruct.startTs || 0) + (FuncStruct.selectFuncStruct.dur || 0), - shiftKey - ); - } else if (IrqStruct.selectIrqStruct) { - this.slicestime = this.timerShaftEL?.setSlicesMark( - IrqStruct.selectIrqStruct.startNS || 0, - (IrqStruct.selectIrqStruct.startNS || 0) + (IrqStruct.selectIrqStruct.dur || 0), - shiftKey - ); - } else if (TraceRow.rangeSelectObject) { - this.slicestime = this.timerShaftEL?.setSlicesMark( - TraceRow.rangeSelectObject.startNS || 0, - TraceRow.rangeSelectObject.endNS || 0, - shiftKey - ); - } else if (JankStruct.selectJankStruct) { - this.slicestime = this.timerShaftEL?.setSlicesMark( - JankStruct.selectJankStruct.ts || 0, - (JankStruct.selectJankStruct.ts || 0) + (JankStruct.selectJankStruct.dur || 0), - shiftKey - ); - } else if (AppStartupStruct.selectStartupStruct) { - this.slicestime = this.timerShaftEL?.setSlicesMark( - AppStartupStruct.selectStartupStruct.startTs || 0, - (AppStartupStruct.selectStartupStruct.startTs || 0) + (AppStartupStruct.selectStartupStruct.dur || 0), - shiftKey - ); - } else if (SoStruct.selectSoStruct) { - this.slicestime = this.timerShaftEL?.setSlicesMark( - SoStruct.selectSoStruct.startTs || 0, - (SoStruct.selectSoStruct.startTs || 0) + (SoStruct.selectSoStruct.dur || 0), - shiftKey - ); - } else if (AllAppStartupStruct.selectStartupStruct) { - this.slicestime = this.timerShaftEL?.setSlicesMark( - AllAppStartupStruct.selectStartupStruct.startTs || 0, - (AllAppStartupStruct.selectStartupStruct.startTs || 0) + (AllAppStartupStruct.selectStartupStruct.dur || 0), - shiftKey - ); - } else if (FrameAnimationStruct.selectFrameAnimationStruct) { - this.timerShaftEL?.setSlicesMark( - FrameAnimationStruct.selectFrameAnimationStruct.startTs || 0, - (FrameAnimationStruct.selectFrameAnimationStruct.startTs || 0) + - (FrameAnimationStruct.selectFrameAnimationStruct.dur || 0) - ); - } else if (JsCpuProfilerStruct.selectJsCpuProfilerStruct) { - this.timerShaftEL?.setSlicesMark( - JsCpuProfilerStruct.selectJsCpuProfilerStruct.startTime || 0, - (JsCpuProfilerStruct.selectJsCpuProfilerStruct.startTime || 0) + - (JsCpuProfilerStruct.selectJsCpuProfilerStruct.totalTime || 0) - ); + public setSLiceMark = (shiftKey: boolean): SlicesTime | null | undefined => { + const selectedStruct : any = + CpuStruct.selectCpuStruct || + ThreadStruct.selectThreadStruct || + FuncStruct.selectFuncStruct || + IrqStruct.selectIrqStruct || + TraceRow.rangeSelectObject || + JankStruct.selectJankStruct || + AppStartupStruct.selectStartupStruct || + SoStruct.selectSoStruct || + AllAppStartupStruct.selectStartupStruct || + FrameAnimationStruct.selectFrameAnimationStruct || + JsCpuProfilerStruct.selectJsCpuProfilerStruct; + + if (selectedStruct) { + const startTs = selectedStruct.startTs || selectedStruct.startTime || selectedStruct.startNS || 0; + const dur = selectedStruct.dur || selectedStruct.totalTime || selectedStruct.endNS || 0; + + this.slicestime = this.timerShaftEL?.setSlicesMark(startTs, startTs + dur, shiftKey); } else { this.slicestime = this.timerShaftEL?.setSlicesMark(); } + return this.slicestime; - } + }; stopWASD = (): void => { setTimeout((): void => { @@ -1040,9 +997,10 @@ export class SpSystemTrace extends BaseElement { SnapshotStruct.hoverSnapshotStruct = undefined; HiPerfCallChartStruct.hoverPerfCallCutStruct = undefined; this.tipEL!.style.display = 'none'; + return this; } - selectStructNull(): void { + selectStructNull() { CpuStruct.selectCpuStruct = undefined; CpuStruct.wakeupBean = null; CpuFreqStruct.selectCpuFreqStruct = undefined; @@ -1065,6 +1023,7 @@ export class SpSystemTrace extends BaseElement { SnapshotStruct.selectSnapshotStruct = undefined; HiPerfCallChartStruct.selectStruct = undefined; AllAppStartupStruct.selectStartupStruct = undefined; + return this; } isWASDKeyPress() { @@ -1250,11 +1209,11 @@ export class SpSystemTrace extends BaseElement { SpSystemTraceDrawTaskPollLine(this, row); } drawJankLine(endParentRow: any, selectJankStruct: JankStruct, data: any) { - SpSystemTraceDrawJankLine(this, endParentRow, selectJankStruct, data); + spSystemTraceDrawJankLine(this, endParentRow, selectJankStruct, data); } drawThreadLine(endParentRow: any, selectThreadStruct: ThreadStruct | undefined, data: any) { - SpSystemTraceDrawThreadLine(this, endParentRow, selectThreadStruct, data); + spSystemTraceDrawThreadLine(this, endParentRow, selectThreadStruct, data); } getStartRow(selectRowId: number | undefined, collectList: any[]): any { @@ -1326,8 +1285,7 @@ export class SpSystemTrace extends BaseElement { rangeRuler.translate(offset); } - connectedCallback() { - this.initPointToEvent(); + private eventListener(): void { /** * 监听时间轴区间变化 */ @@ -1357,13 +1315,10 @@ export class SpSystemTrace extends BaseElement { document.addEventListener('keypress', this.documentOnKeyPress); document.addEventListener('keyup', this.documentOnKeyUp); document.addEventListener('contextmenu', this.onContextMenuHandler); + this.wheelListener(); + } - /** - * 泳道图中添加ctrl+鼠标滚轮事件,对泳道图进行放大缩小。 - * 鼠标滚轮事件转化为键盘事件,keyPress和keyUp两个事件需要配合使用, - * 否则泳道图会一直放大或一直缩小。 - * setTimeout()函数中的时间参数可以控制鼠标滚轮的频率。 - */ + private wheelListener() { document.addEventListener( 'wheel', (e) => { @@ -1398,7 +1353,17 @@ export class SpSystemTrace extends BaseElement { }, { passive: false } ); + } + connectedCallback(): void { + this.initPointToEvent(); + this.eventListener(); + /** + * 泳道图中添加ctrl+鼠标滚轮事件,对泳道图进行放大缩小。 + * 鼠标滚轮事件转化为键盘事件,keyPress和keyUp两个事件需要配合使用, + * 否则泳道图会一直放大或一直缩小。 + * setTimeout()函数中的时间参数可以控制鼠标滚轮的频率。 + */ SpApplication.skinChange2 = (val: boolean) => { this.timerShaftEL?.render(); }; @@ -1722,24 +1687,26 @@ export class SpSystemTrace extends BaseElement { return SpSystemTraceShowStruct(this, previous, currentIndex, structs, retargetIndex); } - scrollToActFunc(funcStract: any, highlight: boolean) { + private toTargetDepth = (entry: any, funcRowID: number, funcStract: any) => { + if (entry) { + this.hoverStructNull(); + this.selectStructNull(); + this.wakeupListNull(); + FuncStruct.hoverFuncStruct = entry; + FuncStruct.selectFuncStruct = entry; + this.onClickHandler(TraceRow.ROW_TYPE_FUNC); + this.scrollToDepth(`${funcRowID}`, `${funcStract.pid}`, 'func', true, entry.depth || 0); + } + }; + + scrollToActFunc(funcStract: any, highlight: boolean): void { if (!Utils.isBinder(funcStract)) { if (funcStract.dur === -1) { funcStract.dur = (TraceRow.range?.totalNS || 0) - (funcStract.startTs || 0); funcStract.flag = 'Did not end'; } } - const toTargetDepth = (entry: any) => { - if (entry) { - this.hoverStructNull(); - this.selectStructNull(); - this.wakeupListNull(); - FuncStruct.hoverFuncStruct = entry; - FuncStruct.selectFuncStruct = entry; - this.onClickHandler(TraceRow.ROW_TYPE_FUNC); - this.scrollToDepth(`${funcRowID}`, `${funcStract.pid}`, 'func', true, entry.depth || 0); - } - }; + let funcRowID = funcStract.cookie == null ? funcStract.tid : `${funcStract.funName}-${funcStract.pid}`; let targetRow = this.favoriteChartListEL?.getCollectRow((row) => { return row.rowId === funcRowID && row.rowType === 'func'; @@ -1748,7 +1715,7 @@ export class SpSystemTrace extends BaseElement { targetRow.fixedList[0] = funcStract; targetRow.highlight = highlight; //如果目标泳道图在收藏上面,则跳转至收藏 - toTargetDepth(funcStract); + this.toTargetDepth(funcStract, funcRowID, funcStract); return; } let parentRow = this.rowsEL!.querySelector>(`trace-row[row-id='${funcStract.pid}'][folder]`); @@ -1771,7 +1738,7 @@ export class SpSystemTrace extends BaseElement { row.expansion = true; } const completeEntry = () => { - toTargetDepth(filterRow.fixedList[0]); + this.toTargetDepth(filterRow.fixedList[0], funcRowID, funcStract); }; if (filterRow!.isComplete) { completeEntry(); @@ -1955,8 +1922,9 @@ export class SpSystemTrace extends BaseElement { }); } - wakeupListNull(): void { + wakeupListNull() { SpSystemTrace.wakeupList = []; + return this; } initPointToEvent(): void { diff --git a/ide/src/trace/component/chart/SpAbilityMonitorChart.ts b/ide/src/trace/component/chart/SpAbilityMonitorChart.ts index 4b1e556f..09bef067 100644 --- a/ide/src/trace/component/chart/SpAbilityMonitorChart.ts +++ b/ide/src/trace/component/chart/SpAbilityMonitorChart.ts @@ -167,50 +167,18 @@ export class SpAbilityMonitorChart { hasTotal = true; } let cpuNameList: Array = ['Total', 'User', 'System']; - let traceRow = TraceRow.skeleton(); - traceRow.rowParentId = `abilityMonitor`; - traceRow.rowHidden = !processRow.expansion; - traceRow.rowId = cpuNameList[0]; - traceRow.rowType = TraceRow.ROW_TYPE_CPU_ABILITY; - traceRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; - traceRow.selectChangeHandler = this.trace.selectChangeHandler; - traceRow.style.height = '40px'; - traceRow.style.width = `100%`; - traceRow.setAttribute('children', ''); - traceRow.name = `CPU ${cpuNameList[0]} Load`; - traceRow.supplierFrame = (): Promise => - cpuAbilityUserDataSender(traceRow, 'CpuAbilityMonitorData').then((res): CpuAbilityMonitorStruct[] => { - this.computeDur(res); - return res; - }); - traceRow.focusHandler = (ev): void => { - let monitorCpuTip = (CpuAbilityMonitorStruct.hoverCpuAbilityStruct?.value || 0).toFixed(2) + '%'; - this.trace?.displayTip(traceRow, CpuAbilityMonitorStruct.hoverCpuAbilityStruct, `${monitorCpuTip}`); - }; - traceRow.findHoverStruct = (): void => { - CpuAbilityMonitorStruct.hoverCpuAbilityStruct = traceRow.getHoverStruct(); - }; - traceRow.onThreadHandler = (useCache): void => { - let context: CanvasRenderingContext2D; - if (traceRow.currentContext) { - context = traceRow.currentContext; - } else { - context = traceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; - } - traceRow.canvasSave(context); - (renders['monitorCpu'] as CpuAbilityRender).renderMainThread( - { - context: context, - useCache: useCache, - type: `monitorCpu0`, - maxCpuUtilization: 100, - maxCpuUtilizationName: hasTotal ? '100%' : '0%', - }, - traceRow - ); - traceRow.canvasRestore(context, this.trace); - }; - processRow.addChildTraceRow(traceRow); + this.initTotalMonitorTraceRow(processRow, cpuNameList, hasTotal); + this.initUserMonitorTraceRow(processRow, cpuNameList, hasUserLoad); + this.initSysMonitorTraceRow(processRow, cpuNameList, hasSystemLoad); + let durTime = new Date().getTime() - time; + info('The time to load the Ability Cpu is: ', durTime); + }; + + private initUserMonitorTraceRow( + processRow: TraceRow, + cpuNameList: Array, + hasUserLoad: boolean + ): void { let userTraceRow = TraceRow.skeleton(); userTraceRow.rowParentId = `abilityMonitor`; userTraceRow.rowHidden = !processRow.expansion; @@ -259,6 +227,64 @@ export class SpAbilityMonitorChart { userTraceRow.canvasRestore(context, this.trace); }; processRow.addChildTraceRow(userTraceRow); + } + + private initTotalMonitorTraceRow( + processRow: TraceRow, + cpuNameList: Array, + hasTotal: boolean + ): void { + let traceRow = TraceRow.skeleton(); + traceRow.rowParentId = `abilityMonitor`; + traceRow.rowHidden = !processRow.expansion; + traceRow.rowId = cpuNameList[0]; + traceRow.rowType = TraceRow.ROW_TYPE_CPU_ABILITY; + traceRow.favoriteChangeHandler = this.trace.favoriteChangeHandler; + traceRow.selectChangeHandler = this.trace.selectChangeHandler; + traceRow.style.height = '40px'; + traceRow.style.width = `100%`; + traceRow.setAttribute('children', ''); + traceRow.name = `CPU ${cpuNameList[0]} Load`; + traceRow.supplierFrame = (): Promise => + cpuAbilityUserDataSender(traceRow, 'CpuAbilityMonitorData').then((res): CpuAbilityMonitorStruct[] => { + this.computeDur(res); + return res; + }); + traceRow.focusHandler = (ev): void => { + let monitorCpuTip = (CpuAbilityMonitorStruct.hoverCpuAbilityStruct?.value || 0).toFixed(2) + '%'; + this.trace?.displayTip(traceRow, CpuAbilityMonitorStruct.hoverCpuAbilityStruct, `${monitorCpuTip}`); + }; + traceRow.findHoverStruct = (): void => { + CpuAbilityMonitorStruct.hoverCpuAbilityStruct = traceRow.getHoverStruct(); + }; + traceRow.onThreadHandler = (useCache): void => { + let context: CanvasRenderingContext2D; + if (traceRow.currentContext) { + context = traceRow.currentContext; + } else { + context = traceRow.collect ? this.trace.canvasFavoritePanelCtx! : this.trace.canvasPanelCtx!; + } + traceRow.canvasSave(context); + (renders['monitorCpu'] as CpuAbilityRender).renderMainThread( + { + context: context, + useCache: useCache, + type: `monitorCpu0`, + maxCpuUtilization: 100, + maxCpuUtilizationName: hasTotal ? '100%' : '0%', + }, + traceRow + ); + traceRow.canvasRestore(context, this.trace); + }; + processRow.addChildTraceRow(traceRow); + } + + private initSysMonitorTraceRow( + processRow: TraceRow, + cpuNameList: Array, + hasSystemLoad: boolean + ): void { let sysTraceRow = TraceRow.skeleton(); sysTraceRow.rowParentId = `abilityMonitor`; sysTraceRow.rowHidden = !processRow.expansion; @@ -275,13 +301,9 @@ export class SpAbilityMonitorChart { this.computeDur(res); return res; }); - sysTraceRow.focusHandler = (ev): void => { - let monitorCpuTip = (CpuAbilityMonitorStruct.hoverCpuAbilityStruct?.value || 0).toFixed(2) + '%'; - this.trace?.displayTip( - sysTraceRow, - CpuAbilityMonitorStruct.hoverCpuAbilityStruct, - `${monitorCpuTip}` - ); + sysTraceRow.focusHandler = (): void => { + this.trace?.displayTip(sysTraceRow, CpuAbilityMonitorStruct.hoverCpuAbilityStruct, + `${(CpuAbilityMonitorStruct.hoverCpuAbilityStruct?.value || 0).toFixed(2) + '%'}`); }; sysTraceRow.findHoverStruct = (): void => { CpuAbilityMonitorStruct.hoverCpuAbilityStruct = sysTraceRow.getHoverStruct(); @@ -307,9 +329,7 @@ export class SpAbilityMonitorChart { sysTraceRow.canvasRestore(context, this.trace); }; processRow.addChildTraceRow(sysTraceRow); - let durTime = new Date().getTime() - time; - info('The time to load the Ability Cpu is: ', durTime); - }; + } private initMemoryAbility = async (processRow: TraceRow): Promise => { let time = new Date().getTime(); @@ -1052,4 +1072,4 @@ export class SpAbilityMonitorChart { } }); } -} \ No newline at end of file +} diff --git a/ide/src/trace/component/setting/bean/ProfilerServiceTypes.ts b/ide/src/trace/component/setting/bean/ProfilerServiceTypes.ts index 309bf042..36745e79 100644 --- a/ide/src/trace/component/setting/bean/ProfilerServiceTypes.ts +++ b/ide/src/trace/component/setting/bean/ProfilerServiceTypes.ts @@ -125,398 +125,23 @@ export interface MemoryConfig { } const switchCase = (object: any): SysVMeminfoType => { - switch (object) { - case 0: - case 'VMEMINFO_UNSPECIFIED': - return SysVMeminfoType.VMEMINFO_UNSPECIFIED; - case 1: - case 'VMEMINFO_NR_FREE_PAGES': - return SysVMeminfoType.VMEMINFO_NR_FREE_PAGES; - case 2: - case 'VMEMINFO_NR_ALLOC_BATCH': - return SysVMeminfoType.VMEMINFO_NR_ALLOC_BATCH; - case 3: - case 'VMEMINFO_NR_INACTIVE_ANON': - return SysVMeminfoType.VMEMINFO_NR_INACTIVE_ANON; - case 4: - case 'VMEMINFO_NR_ACTIVE_ANON': - return SysVMeminfoType.VMEMINFO_NR_ACTIVE_ANON; - case 5: - case 'VMEMINFO_NR_INACTIVE_FILE': - return SysVMeminfoType.VMEMINFO_NR_INACTIVE_FILE; - case 6: - case 'VMEMINFO_NR_ACTIVE_FILE': - return SysVMeminfoType.VMEMINFO_NR_ACTIVE_FILE; - case 7: - case 'VMEMINFO_NR_UNEVICTABLE': - return SysVMeminfoType.VMEMINFO_NR_UNEVICTABLE; - case 8: - case 'VMEMINFO_NR_MLOCK': - return SysVMeminfoType.VMEMINFO_NR_MLOCK; - case 9: - case 'VMEMINFO_NR_ANON_PAGES': - return SysVMeminfoType.VMEMINFO_NR_ANON_PAGES; - case 10: - case 'VMEMINFO_NR_MAPPED': - return SysVMeminfoType.VMEMINFO_NR_MAPPED; - case 11: - case 'VMEMINFO_NR_FILE_PAGES': - return SysVMeminfoType.VMEMINFO_NR_FILE_PAGES; - case 12: - case 'VMEMINFO_NR_DIRTY': - return SysVMeminfoType.VMEMINFO_NR_DIRTY; - case 13: - case 'VMEMINFO_NR_WRITEBACK': - return SysVMeminfoType.VMEMINFO_NR_WRITEBACK; - case 14: - case 'VMEMINFO_NR_SLAB_RECLAIMABLE': - return SysVMeminfoType.VMEMINFO_NR_SLAB_RECLAIMABLE; - case 15: - case 'VMEMINFO_NR_SLAB_UNRECLAIMABLE': - return SysVMeminfoType.VMEMINFO_NR_SLAB_UNRECLAIMABLE; - case 16: - case 'VMEMINFO_NR_PAGE_TABLE_PAGES': - return SysVMeminfoType.VMEMINFO_NR_PAGE_TABLE_PAGES; - case 17: - case 'VMEMINFO_NR_KERNEL_STACK': - return SysVMeminfoType.VMEMINFO_NR_KERNEL_STACK; - case 18: - case 'VMEMINFO_NR_OVERHEAD': - return SysVMeminfoType.VMEMINFO_NR_OVERHEAD; - case 19: - case 'VMEMINFO_NR_UNSTABLE': - return SysVMeminfoType.VMEMINFO_NR_UNSTABLE; - case 20: - case 'VMEMINFO_NR_BOUNCE': - return SysVMeminfoType.VMEMINFO_NR_BOUNCE; - case 21: - case 'VMEMINFO_NR_VMSCAN_WRITE': - return SysVMeminfoType.VMEMINFO_NR_VMSCAN_WRITE; - case 22: - case 'VMEMINFO_NR_VMSCAN_IMMEDIATE_RECLAIM': - return SysVMeminfoType.VMEMINFO_NR_VMSCAN_IMMEDIATE_RECLAIM; - case 23: - case 'VMEMINFO_NR_WRITEBACK_TEMP': - return SysVMeminfoType.VMEMINFO_NR_WRITEBACK_TEMP; - case 24: - case 'VMEMINFO_NR_ISOLATED_ANON': - return SysVMeminfoType.VMEMINFO_NR_ISOLATED_ANON; - case 25: - case 'VMEMINFO_NR_ISOLATED_FILE': - return SysVMeminfoType.VMEMINFO_NR_ISOLATED_FILE; - case 26: - case 'VMEMINFO_NR_SHMEM': - return SysVMeminfoType.VMEMINFO_NR_SHMEM; - case 27: - case 'VMEMINFO_NR_DIRTIED': - return SysVMeminfoType.VMEMINFO_NR_DIRTIED; - case 28: - case 'VMEMINFO_NR_WRITTEN': - return SysVMeminfoType.VMEMINFO_NR_WRITTEN; - case 29: - case 'VMEMINFO_NR_PAGES_SCANNED': - return SysVMeminfoType.VMEMINFO_NR_PAGES_SCANNED; - case 30: - case 'VMEMINFO_WORKINGSET_REFAULT': - return SysVMeminfoType.VMEMINFO_WORKINGSET_REFAULT; - case 31: - case 'VMEMINFO_WORKINGSET_ACTIVATE': - return SysVMeminfoType.VMEMINFO_WORKINGSET_ACTIVATE; - case 32: - case 'VMEMINFO_WORKINGSET_NODERECLAIM': - return SysVMeminfoType.VMEMINFO_WORKINGSET_NODERECLAIM; - case 33: - case 'VMEMINFO_NR_ANON_TRANSPARENT_HUGEPAGES': - return SysVMeminfoType.VMEMINFO_NR_ANON_TRANSPARENT_HUGEPAGES; - case 34: - case 'VMEMINFO_NR_FREE_CMA': - return SysVMeminfoType.VMEMINFO_NR_FREE_CMA; - case 35: - case 'VMEMINFO_NR_SWAPCACHE': - return SysVMeminfoType.VMEMINFO_NR_SWAPCACHE; - case 36: - case 'VMEMINFO_NR_DIRTY_THRESHOLD': - return SysVMeminfoType.VMEMINFO_NR_DIRTY_THRESHOLD; - case 37: - case 'VMEMINFO_NR_DIRTY_BACKGROUND_THRESHOLD': - return SysVMeminfoType.VMEMINFO_NR_DIRTY_BACKGROUND_THRESHOLD; - case 38: - case 'VMEMINFO_PGPGIN': - return SysVMeminfoType.VMEMINFO_PGPGIN; - case 39: - case 'VMEMINFO_PGPGOUT': - return SysVMeminfoType.VMEMINFO_PGPGOUT; - case 40: - case 'VMEMINFO_PGPGOUTCLEAN': - return SysVMeminfoType.VMEMINFO_PGPGOUTCLEAN; - case 41: - case 'VMEMINFO_PSWPIN': - return SysVMeminfoType.VMEMINFO_PSWPIN; - case 42: - case 'VMEMINFO_PSWPOUT': - return SysVMeminfoType.VMEMINFO_PSWPOUT; - case 43: - case 'VMEMINFO_PGALLOC_DMA': - return SysVMeminfoType.VMEMINFO_PGALLOC_DMA; - case 44: - case 'VMEMINFO_PGALLOC_NORMAL': - return SysVMeminfoType.VMEMINFO_PGALLOC_NORMAL; - case 45: - case 'VMEMINFO_PGALLOC_MOVABLE': - return SysVMeminfoType.VMEMINFO_PGALLOC_MOVABLE; - case 46: - case 'VMEMINFO_PGFREE': - return SysVMeminfoType.VMEMINFO_PGFREE; - case 47: - case 'VMEMINFO_PGACTIVATE': - return SysVMeminfoType.VMEMINFO_PGACTIVATE; - case 48: - case 'VMEMINFO_PGDEACTIVATE': - return SysVMeminfoType.VMEMINFO_PGDEACTIVATE; - case 49: - case 'VMEMINFO_PGFAULT': - return SysVMeminfoType.VMEMINFO_PGFAULT; - case 50: - case 'VMEMINFO_PGMAJFAULT': - return SysVMeminfoType.VMEMINFO_PGMAJFAULT; - case 51: - case 'VMEMINFO_PGREFILL_DMA': - return SysVMeminfoType.VMEMINFO_PGREFILL_DMA; - case 52: - case 'VMEMINFO_PGREFILL_NORMAL': - return SysVMeminfoType.VMEMINFO_PGREFILL_NORMAL; - case 53: - case 'VMEMINFO_PGREFILL_MOVABLE': - return SysVMeminfoType.VMEMINFO_PGREFILL_MOVABLE; - case 54: - case 'VMEMINFO_PGSTEAL_KSWAPD_DMA': - return SysVMeminfoType.VMEMINFO_PGSTEAL_KSWAPD_DMA; - case 55: - case 'VMEMINFO_PGSTEAL_KSWAPD_NORMAL': - return SysVMeminfoType.VMEMINFO_PGSTEAL_KSWAPD_NORMAL; - case 56: - case 'VMEMINFO_PGSTEAL_KSWAPD_MOVABLE': - return SysVMeminfoType.VMEMINFO_PGSTEAL_KSWAPD_MOVABLE; - case 57: - case 'VMEMINFO_PGSTEAL_DIRECT_DMA': - return SysVMeminfoType.VMEMINFO_PGSTEAL_DIRECT_DMA; - case 58: - case 'VMEMINFO_PGSTEAL_DIRECT_NORMAL': - return SysVMeminfoType.VMEMINFO_PGSTEAL_DIRECT_NORMAL; - case 59: - case 'VMEMINFO_PGSTEAL_DIRECT_MOVABLE': - return SysVMeminfoType.VMEMINFO_PGSTEAL_DIRECT_MOVABLE; - case 60: - case 'VMEMINFO_PGSCAN_KSWAPD_DMA': - return SysVMeminfoType.VMEMINFO_PGSCAN_KSWAPD_DMA; - case 61: - case 'VMEMINFO_PGSCAN_KSWAPD_NORMAL': - return SysVMeminfoType.VMEMINFO_PGSCAN_KSWAPD_NORMAL; - case 62: - case 'VMEMINFO_PGSCAN_KSWAPD_MOVABLE': - return SysVMeminfoType.VMEMINFO_PGSCAN_KSWAPD_MOVABLE; - case 63: - case 'VMEMINFO_PGSCAN_DIRECT_DMA': - return SysVMeminfoType.VMEMINFO_PGSCAN_DIRECT_DMA; - case 64: - case 'VMEMINFO_PGSCAN_DIRECT_NORMAL': - return SysVMeminfoType.VMEMINFO_PGSCAN_DIRECT_NORMAL; - case 65: - case 'VMEMINFO_PGSCAN_DIRECT_MOVABLE': - return SysVMeminfoType.VMEMINFO_PGSCAN_DIRECT_MOVABLE; - case 66: - case 'VMEMINFO_PGSCAN_DIRECT_THROTTLE': - return SysVMeminfoType.VMEMINFO_PGSCAN_DIRECT_THROTTLE; - case 67: - case 'VMEMINFO_PGINODESTEAL': - return SysVMeminfoType.VMEMINFO_PGINODESTEAL; - case 68: - case 'VMEMINFO_SLABS_SCANNED': - return SysVMeminfoType.VMEMINFO_SLABS_SCANNED; - case 69: - case 'VMEMINFO_KSWAPD_INODESTEAL': - return SysVMeminfoType.VMEMINFO_KSWAPD_INODESTEAL; - case 70: - case 'VMEMINFO_KSWAPD_LOW_WMARK_HIT_QUICKLY': - return SysVMeminfoType.VMEMINFO_KSWAPD_LOW_WMARK_HIT_QUICKLY; - case 71: - case 'VMEMINFO_KSWAPD_HIGH_WMARK_HIT_QUICKLY': - return SysVMeminfoType.VMEMINFO_KSWAPD_HIGH_WMARK_HIT_QUICKLY; - case 72: - case 'VMEMINFO_PAGEOUTRUN': - return SysVMeminfoType.VMEMINFO_PAGEOUTRUN; - case 73: - case 'VMEMINFO_ALLOCSTALL': - return SysVMeminfoType.VMEMINFO_ALLOCSTALL; - case 74: - case 'VMEMINFO_PGROTATED': - return SysVMeminfoType.VMEMINFO_PGROTATED; - case 75: - case 'VMEMINFO_DROP_PAGECACHE': - return SysVMeminfoType.VMEMINFO_DROP_PAGECACHE; - case 76: - case 'VMEMINFO_DROP_SLAB': - return SysVMeminfoType.VMEMINFO_DROP_SLAB; - case 77: - case 'VMEMINFO_PGMIGRATE_SUCCESS': - return SysVMeminfoType.VMEMINFO_PGMIGRATE_SUCCESS; - case 78: - case 'VMEMINFO_PGMIGRATE_FAIL': - return SysVMeminfoType.VMEMINFO_PGMIGRATE_FAIL; - case 79: - case 'VMEMINFO_COMPACT_MIGRATE_SCANNED': - return SysVMeminfoType.VMEMINFO_COMPACT_MIGRATE_SCANNED; - case 80: - case 'VMEMINFO_COMPACT_FREE_SCANNED': - return SysVMeminfoType.VMEMINFO_COMPACT_FREE_SCANNED; - case 81: - case 'VMEMINFO_COMPACT_ISOLATED': - return SysVMeminfoType.VMEMINFO_COMPACT_ISOLATED; - case 82: - case 'VMEMINFO_COMPACT_STALL': - return SysVMeminfoType.VMEMINFO_COMPACT_STALL; - case 83: - case 'VMEMINFO_COMPACT_FAIL': - return SysVMeminfoType.VMEMINFO_COMPACT_FAIL; - case 84: - case 'VMEMINFO_COMPACT_SUCCESS': - return SysVMeminfoType.VMEMINFO_COMPACT_SUCCESS; - case 85: - case 'VMEMINFO_COMPACT_DAEMON_WAKE': - return SysVMeminfoType.VMEMINFO_COMPACT_DAEMON_WAKE; - case 86: - case 'VMEMINFO_UNEVICTABLE_PGS_CULLED': - return SysVMeminfoType.VMEMINFO_UNEVICTABLE_PGS_CULLED; - case 87: - case 'VMEMINFO_UNEVICTABLE_PGS_SCANNED': - return SysVMeminfoType.VMEMINFO_UNEVICTABLE_PGS_SCANNED; - case 88: - case 'VMEMINFO_UNEVICTABLE_PGS_RESCUED': - return SysVMeminfoType.VMEMINFO_UNEVICTABLE_PGS_RESCUED; - case 89: - case 'VMEMINFO_UNEVICTABLE_PGS_MLOCKED': - return SysVMeminfoType.VMEMINFO_UNEVICTABLE_PGS_MLOCKED; - case 90: - case 'VMEMINFO_UNEVICTABLE_PGS_MUNLOCKED': - return SysVMeminfoType.VMEMINFO_UNEVICTABLE_PGS_MUNLOCKED; - case 91: - case 'VMEMINFO_UNEVICTABLE_PGS_CLEARED': - return SysVMeminfoType.VMEMINFO_UNEVICTABLE_PGS_CLEARED; - case 92: - case 'VMEMINFO_UNEVICTABLE_PGS_STRANDED': - return SysVMeminfoType.VMEMINFO_UNEVICTABLE_PGS_STRANDED; - case 93: - case 'VMEMINFO_NR_ZSPAGES': - return SysVMeminfoType.VMEMINFO_NR_ZSPAGES; - case 94: - case 'VMEMINFO_NR_ION_HEAP': - return SysVMeminfoType.VMEMINFO_NR_ION_HEAP; - case 95: - case 'VMEMINFO_NR_GPU_HEAP': - return SysVMeminfoType.VMEMINFO_NR_GPU_HEAP; - case 96: - case 'VMEMINFO_ALLOCSTALL_DMA': - return SysVMeminfoType.VMEMINFO_ALLOCSTALL_DMA; - case 97: - case 'VMEMINFO_ALLOCSTALL_MOVABLE': - return SysVMeminfoType.VMEMINFO_ALLOCSTALL_MOVABLE; - case 98: - case 'VMEMINFO_ALLOCSTALL_NORMAL': - return SysVMeminfoType.VMEMINFO_ALLOCSTALL_NORMAL; - case 99: - case 'VMEMINFO_COMPACT_DAEMON_FREE_SCANNED': - return SysVMeminfoType.VMEMINFO_COMPACT_DAEMON_FREE_SCANNED; - case 100: - case 'VMEMINFO_COMPACT_DAEMON_MIGRATE_SCANNED': - return SysVMeminfoType.VMEMINFO_COMPACT_DAEMON_MIGRATE_SCANNED; - case 101: - case 'VMEMINFO_NR_FASTRPC': - return SysVMeminfoType.VMEMINFO_NR_FASTRPC; - case 102: - case 'VMEMINFO_NR_INDIRECTLY_RECLAIMABLE': - return SysVMeminfoType.VMEMINFO_NR_INDIRECTLY_RECLAIMABLE; - case 103: - case 'VMEMINFO_NR_ION_HEAP_POOL': - return SysVMeminfoType.VMEMINFO_NR_ION_HEAP_POOL; - case 104: - case 'VMEMINFO_NR_KERNEL_MISC_RECLAIMABLE': - return SysVMeminfoType.VMEMINFO_NR_KERNEL_MISC_RECLAIMABLE; - case 105: - case 'VMEMINFO_NR_SHADOW_CALL_STACK_BYTES': - return SysVMeminfoType.VMEMINFO_NR_SHADOW_CALL_STACK_BYTES; - case 106: - case 'VMEMINFO_NR_SHMEM_HUGEPAGES': - return SysVMeminfoType.VMEMINFO_NR_SHMEM_HUGEPAGES; - case 107: - case 'VMEMINFO_NR_SHMEM_PMDMAPPED': - return SysVMeminfoType.VMEMINFO_NR_SHMEM_PMDMAPPED; - case 108: - case 'VMEMINFO_NR_UNRECLAIMABLE_PAGES': - return SysVMeminfoType.VMEMINFO_NR_UNRECLAIMABLE_PAGES; - case 109: - case 'VMEMINFO_NR_ZONE_ACTIVE_ANON': - return SysVMeminfoType.VMEMINFO_NR_ZONE_ACTIVE_ANON; - case 110: - case 'VMEMINFO_NR_ZONE_ACTIVE_FILE': - return SysVMeminfoType.VMEMINFO_NR_ZONE_ACTIVE_FILE; - case 111: - case 'VMEMINFO_NR_ZONE_INACTIVE_ANON': - return SysVMeminfoType.VMEMINFO_NR_ZONE_INACTIVE_ANON; - case 112: - case 'VMEMINFO_NR_ZONE_INACTIVE_FILE': - return SysVMeminfoType.VMEMINFO_NR_ZONE_INACTIVE_FILE; - case 113: - case 'VMEMINFO_NR_ZONE_UNEVICTABLE': - return SysVMeminfoType.VMEMINFO_NR_ZONE_UNEVICTABLE; - case 114: - case 'VMEMINFO_NR_ZONE_WRITE_PENDING': - return SysVMeminfoType.VMEMINFO_NR_ZONE_WRITE_PENDING; - case 115: - case 'VMEMINFO_OOM_KILL': - return SysVMeminfoType.VMEMINFO_OOM_KILL; - case 116: - case 'VMEMINFO_PGLAZYFREE': - return SysVMeminfoType.VMEMINFO_PGLAZYFREE; - case 117: - case 'VMEMINFO_PGLAZYFREED': - return SysVMeminfoType.VMEMINFO_PGLAZYFREED; - case 118: - case 'VMEMINFO_PGREFILL': - return SysVMeminfoType.VMEMINFO_PGREFILL; - case 119: - case 'VMEMINFO_PGSCAN_DIRECT': - return SysVMeminfoType.VMEMINFO_PGSCAN_DIRECT; - case 120: - case 'VMEMINFO_PGSCAN_KSWAPD': - return SysVMeminfoType.VMEMINFO_PGSCAN_KSWAPD; - case 121: - case 'VMEMINFO_PGSKIP_DMA': - return SysVMeminfoType.VMEMINFO_PGSKIP_DMA; - case 122: - case 'VMEMINFO_PGSKIP_MOVABLE': - return SysVMeminfoType.VMEMINFO_PGSKIP_MOVABLE; - case 123: - case 'VMEMINFO_PGSKIP_NORMAL': - return SysVMeminfoType.VMEMINFO_PGSKIP_NORMAL; - case 124: - case 'VMEMINFO_PGSTEAL_DIRECT': - return SysVMeminfoType.VMEMINFO_PGSTEAL_DIRECT; - case 125: - case 'VMEMINFO_PGSTEAL_KSWAPD': - return SysVMeminfoType.VMEMINFO_PGSTEAL_KSWAPD; - case 126: - case 'VMEMINFO_SWAP_RA': - return SysVMeminfoType.VMEMINFO_SWAP_RA; - case 127: - case 'VMEMINFO_SWAP_RA_HIT': - return SysVMeminfoType.VMEMINFO_SWAP_RA_HIT; - case 128: - case 'VMEMINFO_WORKINGSET_RESTORE': - return SysVMeminfoType.VMEMINFO_WORKINGSET_RESTORE; - case -1: - case 'UNRECOGNIZED': - default: - return SysVMeminfoType.UNRECOGNIZED; + if (typeof object === 'number') { + let sysVMemInfos = Object.keys(SysVMeminfoType); + if (object < 0) { + let sysInfo = sysVMemInfos[0]; + // @ts-ignore + return SysVMeminfoType[sysInfo]; + } else { + let infoType = sysVMemInfos[object + 1]; + if (infoType) { + // @ts-ignore + return SysVMeminfoType[infoType]; + } + } + return SysVMeminfoType.UNRECOGNIZED; + } else { + // @ts-ignore + return SysVMeminfoType[object]; } }; @@ -699,126 +324,64 @@ export enum SysMeminfoType { UNRECOGNIZED = 'UNRECOGNIZED', } +const sysMemInfo = [ + SysMeminfoType.MEMINFO_UNSPECIFIED, + SysMeminfoType.MEMINFO_MEM_TOTAL, + SysMeminfoType.MEMINFO_MEM_FREE, + SysMeminfoType.MEMINFO_MEM_AVAILABLE, + SysMeminfoType.MEMINFO_BUFFERS, + SysMeminfoType.MEMINFO_CACHED, + SysMeminfoType.MEMINFO_SWAP_CACHED, + SysMeminfoType.MEMINFO_ACTIVE, + SysMeminfoType.MEMINFO_INACTIVE, + SysMeminfoType.MEMINFO_ACTIVE_ANON, + SysMeminfoType.MEMINFO_INACTIVE_ANON, + SysMeminfoType.MEMINFO_ACTIVE_FILE, + SysMeminfoType.MEMINFO_INACTIVE_FILE, + SysMeminfoType.MEMINFO_UNEVICTABLE, + SysMeminfoType.MEMINFO_MLOCKED, + SysMeminfoType.MEMINFO_SWAP_TOTAL, + SysMeminfoType.MEMINFO_SWAP_FREE, + SysMeminfoType.MEMINFO_DIRTY, + SysMeminfoType.MEMINFO_WRITEBACK, + SysMeminfoType.MEMINFO_ANON_PAGES, + SysMeminfoType.MEMINFO_MAPPED, + SysMeminfoType.MEMINFO_SHMEM, + SysMeminfoType.MEMINFO_SLAB, + SysMeminfoType.MEMINFO_SLAB_RECLAIMABLE, + SysMeminfoType.MEMINFO_SLAB_UNRECLAIMABLE, + SysMeminfoType.MEMINFO_KERNEL_STACK, + SysMeminfoType.MEMINFO_PAGE_TABLES, + SysMeminfoType.MEMINFO_COMMIT_LIMIT, + SysMeminfoType.MEMINFO_COMMITED_AS, + SysMeminfoType.MEMINFO_VMALLOC_TOTAL, + SysMeminfoType.MEMINFO_VMALLOC_USED, + SysMeminfoType.MEMINFO_VMALLOC_CHUNK, + SysMeminfoType.MEMINFO_CMA_TOTAL, + SysMeminfoType.MEMINFO_CMA_FREE, + SysMeminfoType.MEMINFO_KERNEL_RECLAIMABLE, + SysMeminfoType.PMEM_ACTIVE_PURG, + SysMeminfoType.PMEM_INACTIVE_PURG, + SysMeminfoType.PMEM_PINED_PURG, + SysMeminfoType.UNRECOGNIZED +]; + const sysMeminfoCase = (object: any): SysMeminfoType => { - switch (object) { - case 0: - case 'MEMINFO_UNSPECIFIED': - return SysMeminfoType.MEMINFO_UNSPECIFIED; - case 1: - case 'MEMINFO_MEM_TOTAL': - return SysMeminfoType.MEMINFO_MEM_TOTAL; - case 2: - case 'MEMINFO_MEM_FREE': - return SysMeminfoType.MEMINFO_MEM_FREE; - case 3: - case 'MEMINFO_MEM_AVAILABLE': - return SysMeminfoType.MEMINFO_MEM_AVAILABLE; - case 4: - case 'MEMINFO_BUFFERS': - return SysMeminfoType.MEMINFO_BUFFERS; - case 5: - case 'MEMINFO_CACHED': - return SysMeminfoType.MEMINFO_CACHED; - case 6: - case 'MEMINFO_SWAP_CACHED': - return SysMeminfoType.MEMINFO_SWAP_CACHED; - case 7: - case 'MEMINFO_ACTIVE': - return SysMeminfoType.MEMINFO_ACTIVE; - case 8: - case 'MEMINFO_INACTIVE': - return SysMeminfoType.MEMINFO_INACTIVE; - case 9: - case 'MEMINFO_ACTIVE_ANON': - return SysMeminfoType.MEMINFO_ACTIVE_ANON; - case 10: - case 'MEMINFO_INACTIVE_ANON': - return SysMeminfoType.MEMINFO_INACTIVE_ANON; - case 11: - case 'MEMINFO_ACTIVE_FILE': - return SysMeminfoType.MEMINFO_ACTIVE_FILE; - case 12: - case 'MEMINFO_INACTIVE_FILE': - return SysMeminfoType.MEMINFO_INACTIVE_FILE; - case 13: - case 'MEMINFO_UNEVICTABLE': - return SysMeminfoType.MEMINFO_UNEVICTABLE; - case 14: - case 'MEMINFO_MLOCKED': - return SysMeminfoType.MEMINFO_MLOCKED; - case 15: - case 'MEMINFO_SWAP_TOTAL': - return SysMeminfoType.MEMINFO_SWAP_TOTAL; - case 16: - case 'MEMINFO_SWAP_FREE': - return SysMeminfoType.MEMINFO_SWAP_FREE; - case 17: - case 'MEMINFO_DIRTY': - return SysMeminfoType.MEMINFO_DIRTY; - case 18: - case 'MEMINFO_WRITEBACK': - return SysMeminfoType.MEMINFO_WRITEBACK; - case 19: - case 'MEMINFO_ANON_PAGES': - return SysMeminfoType.MEMINFO_ANON_PAGES; - case 20: - case 'MEMINFO_MAPPED': - return SysMeminfoType.MEMINFO_MAPPED; - case 21: - case 'MEMINFO_SHMEM': - return SysMeminfoType.MEMINFO_SHMEM; - case 22: - case 'MEMINFO_SLAB': - return SysMeminfoType.MEMINFO_SLAB; - case 23: - case 'MEMINFO_SLAB_RECLAIMABLE': - return SysMeminfoType.MEMINFO_SLAB_RECLAIMABLE; - case 24: - case 'MEMINFO_SLAB_UNRECLAIMABLE': - return SysMeminfoType.MEMINFO_SLAB_UNRECLAIMABLE; - case 25: - case 'MEMINFO_KERNEL_STACK': - return SysMeminfoType.MEMINFO_KERNEL_STACK; - case 26: - case 'MEMINFO_PAGE_TABLES': - return SysMeminfoType.MEMINFO_PAGE_TABLES; - case 27: - case 'MEMINFO_COMMIT_LIMIT': - return SysMeminfoType.MEMINFO_COMMIT_LIMIT; - case 28: - case 'MEMINFO_COMMITED_AS': - return SysMeminfoType.MEMINFO_COMMITED_AS; - case 29: - case 'MEMINFO_VMALLOC_TOTAL': - return SysMeminfoType.MEMINFO_VMALLOC_TOTAL; - case 30: - case 'MEMINFO_VMALLOC_USED': - return SysMeminfoType.MEMINFO_VMALLOC_USED; - case 31: - case 'MEMINFO_VMALLOC_CHUNK': - return SysMeminfoType.MEMINFO_VMALLOC_CHUNK; - case 32: - case 'MEMINFO_CMA_TOTAL': - return SysMeminfoType.MEMINFO_CMA_TOTAL; - case 33: - case 'MEMINFO_CMA_FREE': - return SysMeminfoType.MEMINFO_CMA_FREE; - case 34: - case 'MEMINFO_KERNEL_RECLAIMABLE': - return SysMeminfoType.MEMINFO_KERNEL_RECLAIMABLE; - case 35: - case 'PMEM_ACTIVE_PURG': - return SysMeminfoType.PMEM_ACTIVE_PURG; - case 36: - case 'PMEM_INACTIVE_PURG': - return SysMeminfoType.PMEM_INACTIVE_PURG; - case 37: - case 'PMEM_PINED_PURG': - return SysMeminfoType.PMEM_PINED_PURG; - case -1: - case 'UNRECOGNIZED': - default: + if (typeof object === 'number') { + if (object >= 0) { + let sysMemType = sysMemInfo[object]; + if (sysMemType) { + return sysMemType; + } + } + return SysMeminfoType.UNRECOGNIZED + } else { + // @ts-ignore + let sysMemType = SysMeminfoType[object]; + if (!sysMemType) { return SysMeminfoType.UNRECOGNIZED; + } + return sysMemType; } }; diff --git a/ide/src/trace/component/trace/SpChartList.ts b/ide/src/trace/component/trace/SpChartList.ts index 5d0a252a..b5979582 100644 --- a/ide/src/trace/component/trace/SpChartList.ts +++ b/ide/src/trace/component/trace/SpChartList.ts @@ -87,6 +87,10 @@ export class SpChartList extends BaseElement { } this.refreshFavoriteCanvas(); }); + this.initChartListListener(); + } + + private initChartListListener(): void { this.icon1?.addEventListener('click', () => { this.collect1Expand = !this.collect1Expand; if (this.collect1Expand) { @@ -514,41 +518,44 @@ export class SpChartList extends BaseElement { window.publish(window.SmartEvent.UI.RefreshCanvas, {}); } + private getHtmlCss(): string { + return ``; + } + initHtml(): string { return ` - + ${this.getHtmlCss()}
diff --git a/ide/src/trace/component/trace/TimerShaftElement.html.ts b/ide/src/trace/component/trace/TimerShaftElement.html.ts new file mode 100644 index 00000000..33524c4b --- /dev/null +++ b/ide/src/trace/component/trace/TimerShaftElement.html.ts @@ -0,0 +1,116 @@ +/* + * Copyright (C) 2022 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. + */ + +export const TimerShaftElementHtml = ` + +
+
+
+
+ 10 + 0 +
+ +
+
+
+ + +
+
+ + +
+
+ 123 +
+
+ +
+` diff --git a/ide/src/trace/component/trace/TimerShaftElement.ts b/ide/src/trace/component/trace/TimerShaftElement.ts index e3056418..6113c15b 100644 --- a/ide/src/trace/component/trace/TimerShaftElement.ts +++ b/ide/src/trace/component/trace/TimerShaftElement.ts @@ -25,6 +25,7 @@ import { TraceSheet } from './base/TraceSheet'; import { SelectionParam } from '../../bean/BoxSelection'; import { type SpSystemTrace, CurrentSlicesTime } from '../SpSystemTrace'; import './timer-shaft/CollapseButton'; +import { TimerShaftElementHtml } from './TimerShaftElement.html'; //随机生成十六位进制颜色 export function randomRgbColor() { let r = Math.floor(Math.random() * 255); @@ -249,9 +250,19 @@ export class TimerShaftElement extends BaseElement { this.timeOffsetEL.textContent = ns2UnitS(this._startNS, this._rangeRuler.getScale()); const width = this.canvas?.clientWidth || 0; const height = this.canvas?.clientHeight || 0; + this.setTimeRuler(width); + this.setSportRuler(width, height); + this.setRangeRuler(width); + } + + private setTimeRuler(width: number): void { if (!this.timeRuler) { this.timeRuler = new TimeRuler(this, new Rect(0, 0, width, 20), this._totalNS); } + this.timeRuler.frame.width = width; + } + + private setSportRuler(width: number, height: number): void { if (!this._sportRuler) { this._sportRuler = new SportRuler( this, @@ -267,6 +278,10 @@ export class TimerShaftElement extends BaseElement { } ); } + this._sportRuler.frame.width = width; + } + + private setRangeRuler(width: number): void { if (!this._rangeRuler) { this._rangeRuler = new RangeRuler( this, @@ -301,8 +316,6 @@ export class TimerShaftElement extends BaseElement { ); } this._rangeRuler.frame.width = width; - this._sportRuler.frame.width = width; - this.timeRuler.frame.width = width; } setRangeNS(startNS: number, endNS: number): void { @@ -482,106 +495,6 @@ export class TimerShaftElement extends BaseElement { } initHtml(): string { - return ` - -
-
-
-
- 10 - 0 -
- -
-
-
- - -
-
- - -
-
- 123 -
-
- -
- `; + return TimerShaftElementHtml; } } diff --git a/ide/src/trace/component/trace/base/TraceRowConfig.ts b/ide/src/trace/component/trace/base/TraceRowConfig.ts index 1f35fa2d..5c0a431c 100644 --- a/ide/src/trace/component/trace/base/TraceRowConfig.ts +++ b/ide/src/trace/component/trace/base/TraceRowConfig.ts @@ -408,6 +408,14 @@ export class TraceRowConfig extends BaseElement { this.switchButton = this.shadowRoot?.querySelector('#switch-button'); this.openFileIcon = this.shadowRoot?.querySelector('#open-file-icon'); this.configTitle = this.shadowRoot?.querySelector('#config_title'); + this.initSwitchClickListener(); + this.openFileIcon!.addEventListener('click', () => { + this.openTempFile!.value = ''; + this.openTempFile?.click(); + }); + } + + private initSwitchClickListener(): void { let jsonUrl = `https://${window.location.host.split(':')[0]}:${ window.location.port }/application/trace/config/custom_temp_config.json`; @@ -431,14 +439,14 @@ export class TraceRowConfig extends BaseElement { } else { if (localJson === '') { fetch(jsonUrl) - .then((res) => { - if (res.ok) { - res.text().then((text) => { - localJson = text; - this.loadTempConfig(localJson); - }); - } - }) + .then((res) => { + if (res.ok) { + res.text().then((text) => { + localJson = text; + this.loadTempConfig(localJson); + }); + } + }) ['catch']((err) => { console.log(err); }); @@ -448,11 +456,6 @@ export class TraceRowConfig extends BaseElement { } } }); - - this.openFileIcon!.addEventListener('click', () => { - this.openTempFile!.value = ''; - this.openTempFile?.click(); - }); } private filterSearch(): void { diff --git a/ide/src/trace/component/trace/sheet/TabPaneCurrentSelection.html.ts b/ide/src/trace/component/trace/sheet/TabPaneCurrentSelection.html.ts new file mode 100644 index 00000000..7cb5b465 --- /dev/null +++ b/ide/src/trace/component/trace/sheet/TabPaneCurrentSelection.html.ts @@ -0,0 +1,112 @@ +/* + * Copyright (C) 2022 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. + */ +export const TabPaneCurrentSelectionHtml = ` + +
+
+
+

+
+

Scheduling Latency

+
+ GetWakeupList + +
+
+
+
+
+ + + + + + + + +
+ + +
+
+
+
+ `; \ No newline at end of file diff --git a/ide/src/trace/component/trace/sheet/TabPaneCurrentSelection.ts b/ide/src/trace/component/trace/sheet/TabPaneCurrentSelection.ts index dc8598a3..00ac8ac5 100644 --- a/ide/src/trace/component/trace/sheet/TabPaneCurrentSelection.ts +++ b/ide/src/trace/component/trace/sheet/TabPaneCurrentSelection.ts @@ -35,25 +35,33 @@ import { SpSystemTrace } from '../../SpSystemTrace'; import { AppStartupStruct } from '../../../database/ui-worker/ProcedureWorkerAppStartup'; import { SoStruct } from '../../../database/ui-worker/ProcedureWorkerSoInit'; import { type SelectionParam } from '../../../bean/BoxSelection'; -import { type FrameAnimationStruct } from '../../../database/ui-worker/ProcedureWorkerFrameAnimation'; +import { + type FrameAnimationStruct +} from '../../../database/ui-worker/ProcedureWorkerFrameAnimation'; import { queryBinderByArgsId, queryBinderBySliceId, queryFlowsData, - queryPrecedingData, queryThreadByItid -} from "../../../database/sql/SqlLite.sql"; + queryPrecedingData, + queryThreadByItid +} from '../../../database/sql/SqlLite.sql'; import { - queryBinderArgsByArgset, queryRunnableTimeByRunning, + queryBinderArgsByArgset, + queryRunnableTimeByRunning, queryThreadNearData, - queryThreadStateArgs, queryThreadWakeUp, queryThreadWakeUpFrom -} from "../../../database/sql/ProcessThread.sql"; -import {queryGpuDur} from "../../../database/sql/Gpu.sql"; -import {queryWakeupListPriority} from "../../../database/sql/Cpu.sql"; + queryThreadStateArgs, + queryThreadWakeUp, + queryThreadWakeUpFrom +} from '../../../database/sql/ProcessThread.sql'; +import { queryGpuDur } from '../../../database/sql/Gpu.sql'; +import { queryWakeupListPriority } from '../../../database/sql/Cpu.sql'; +import { TabPaneCurrentSelectionHtml } from './TabPaneCurrentSelection.html'; 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.'; export function getTimeString(ns: number): string { + if (ns === 0) { return '0'; } @@ -65,6 +73,7 @@ export function getTimeString(ns: number): string { let microsecond1 = 1_000; // 1 microsecond let res = ''; if (currentTimeNs >= hour1) { + res += Math.floor(currentTimeNs / hour1) + 'h '; currentTimeNs = currentTimeNs - Math.floor(currentTimeNs / hour1) * hour1; } @@ -122,6 +131,84 @@ export class TabPaneCurrentSelection extends BaseElement { leftTitle.innerText = 'Slice Details'; } let list: any[] = []; + this.updateUI(data, list); + Promise.all([this.queryThreadStateDArgs(data.argSetID), this.queryCPUWakeUpFromData(data)]).then((resArr) => { + let args = resArr[0]; + let bean = resArr[1]; + if (callback) { + callback(bean); + } + if (args.length > 0) { + args.forEach((arg) => { + list.push({name: arg.keyName, value: arg.strValue}); + }); + } + this.currentSelectionTbl!.dataSource = list; + let rightArea: HTMLElement | null | undefined = this?.shadowRoot?.querySelector('#table-right'); + let rightTitle: HTMLElement | null | undefined = this?.shadowRoot?.querySelector('#rightTitle'); + let rightButton: HTMLElement | null | undefined = this?.shadowRoot + ?.querySelector('#rightButton') + ?.shadowRoot?.querySelector('#custom-button'); + let rightStar: HTMLElement | null | undefined = this?.shadowRoot?.querySelector('#right-star'); + this.threadClickEvent(scrollCallback, data); + let canvas = this.initCanvas(); + if (bean !== null) { + this.selectWakeupBean = { + process: `${this.transferString(data.processName || 'Process')}(${data.processId})`, + thread: `${this.transferString(data.name || 'Thread')}(${data.tid})`, + cpu: data.cpu, + dur: data.dur, + priority: data.priority, + isSelected: false, + }; + + this.weakUpBean = bean; + this.updateRightTitleUI(rightArea!, rightTitle!, rightButton!, rightStar!); + this.drawRight(canvas, bean); + } else { + this.handleNullBeanUI(rightArea!, rightTitle!, rightButton!, rightStar!); + } + }); + } + + private threadClickEvent(scrollCallback: ((data: CpuStruct) => void) | undefined, data: CpuStruct): void { + let threadClick = this.currentSelectionTbl?.shadowRoot?.querySelector('#thread-id'); + threadClick?.addEventListener('click', () => { + //cpu点击 + if (scrollCallback) { + data.state = 'Running'; + scrollCallback(data); + } + }); + } + + private updateRightTitleUI(rightArea: HTMLElement, rightTitle: HTMLElement, rightButton: HTMLElement, + rightStar: HTMLElement) { + if (rightArea !== null && rightArea) { + rightArea.style.visibility = 'visible'; + } + if (rightTitle !== null && rightTitle) { + rightTitle.style.visibility = 'visible'; + rightButton!.style.visibility = 'visible'; + rightStar!.style.visibility = 'hidden'; + SpSystemTrace.btnTimer = null; + } + } + + private handleNullBeanUI(rightArea: HTMLElement, rightTitle: HTMLElement, rightButton: HTMLElement, + rightStar: HTMLElement) { + this.weakUpBean = null; + if (rightArea !== null && rightArea) { + rightArea.style.visibility = 'hidden'; + } + if (rightTitle !== null && rightTitle) { + rightTitle.style.visibility = 'hidden'; + rightButton!.style.visibility = 'hidden'; + rightStar!.style.visibility = 'hidden'; + } + } + + private updateUI(data: CpuStruct, list: any[]) { let process = this.transferString(data.processName || 'Process'); let processId = data.processId || data.tid; let state = ''; @@ -153,77 +240,14 @@ export class TabPaneCurrentSelection extends BaseElement {
`, }); } - list.push({ - name: 'StartTime(Relative)', - value: getTimeString(data.startTime || 0), - }); + list.push({name: 'StartTime(Relative)', value: getTimeString(data.startTime || 0),}); list.push({ name: 'StartTime(Absolute)', value: ((data.startTime || 0) + (window as any).recordStartNS) / 1000000000 + 's', }); - list.push({ name: 'Duration', value: getTimeString(data.dur || 0) }); - list.push({ name: 'Prio', value: data.priority || 0 }); - list.push({ name: 'End State', value: state }); - Promise.all([this.queryThreadStateDArgs(data.argSetID), this.queryCPUWakeUpFromData(data)]).then((resArr) => { - let args = resArr[0]; - let bean = resArr[1]; - if (callback) { - callback(bean); - } - if (args.length > 0) { - args.forEach((arg) => { - list.push({ name: arg.keyName, value: arg.strValue }); - }); - } - this.currentSelectionTbl!.dataSource = list; - let rightArea: HTMLElement | null | undefined = this?.shadowRoot?.querySelector('#table-right'); - let rightTitle: HTMLElement | null | undefined = this?.shadowRoot?.querySelector('#rightTitle'); - let rightButton: HTMLElement | null | undefined = this?.shadowRoot - ?.querySelector('#rightButton') - ?.shadowRoot?.querySelector('#custom-button'); - let rightStar: HTMLElement | null | undefined = this?.shadowRoot?.querySelector('#right-star'); - let threadClick = this.currentSelectionTbl?.shadowRoot?.querySelector('#thread-id'); - threadClick?.addEventListener('click', () => { - //cpu点击 - if (scrollCallback) { - data.state = 'Running'; - scrollCallback(data); - } - }); - let canvas = this.initCanvas(); - if (bean !== null) { - this.selectWakeupBean = { - process: `${this.transferString(data.processName || 'Process')}(${data.processId})`, - thread: `${this.transferString(data.name || 'Thread')}(${data.tid})`, - cpu: data.cpu, - dur: data.dur, - priority: data.priority, - isSelected: false, - }; - - this.weakUpBean = bean; - if (rightArea !== null && rightArea) { - rightArea.style.visibility = 'visible'; - } - if (rightTitle !== null && rightTitle) { - rightTitle.style.visibility = 'visible'; - rightButton!.style.visibility = 'visible'; - rightStar!.style.visibility = 'hidden'; - SpSystemTrace.btnTimer = null; - } - this.drawRight(canvas, bean); - } else { - this.weakUpBean = null; - if (rightArea !== null && rightArea) { - rightArea.style.visibility = 'hidden'; - } - if (rightTitle !== null && rightTitle) { - rightTitle.style.visibility = 'hidden'; - rightButton!.style.visibility = 'hidden'; - rightStar!.style.visibility = 'hidden'; - } - } - }); + list.push({name: 'Duration', value: getTimeString(data.dur || 0)}); + list.push({name: 'Prio', value: data.priority || 0}); + list.push({name: 'End State', value: state}); } setFunctionData(data: FuncStruct, scrollCallback: Function): void { @@ -236,89 +260,15 @@ export class TabPaneCurrentSelection extends BaseElement { if (data.argsetid !== undefined && data.argsetid !== null && data.argsetid >= 0) { this.setTableHeight('700px'); if (isAsyncBinder) { - Promise.all([ - queryBinderByArgsId(data.argsetid!, data.startTs!, !data.funName!.endsWith('rcv')), - queryBinderArgsByArgset(data.argsetid), - ]).then((result) => { - let asyncBinderRes = result[0]; - let argsBinderRes = result[1]; - let asyncBinderStract: any; - if (asyncBinderRes.length > 0) { - asyncBinderRes[0].type = TraceRow.ROW_TYPE_FUNC; - asyncBinderStract = asyncBinderRes[0]; - } - if (argsBinderRes.length > 0) { - argsBinderRes.forEach((item) => { - list.push({ - name: item.keyName, - value: item.strValue, - }); - }); - } - if (asyncBinderStract !== undefined) { - list.unshift({ - name: 'Name', - value: `
-
${name || 'binder'}
- -
`, - }); - } else { - list.unshift({ name: 'Name', value: name }); - } - this.addTabPanelContent(list, data); - this.currentSelectionTbl!.dataSource = list; - let funcClick = this.currentSelectionTbl?.shadowRoot?.querySelector('#function-jump'); - funcClick?.addEventListener('click', () => { - scrollCallback(asyncBinderStract); - }); - }); + this.handleAsyncBinder(data, list, name, scrollCallback); } else if (isBinder) { - queryBinderArgsByArgset(data.argsetid).then((argset) => { - let binderSliceId = -1; - argset.forEach((item) => { - if (item.keyName === 'destination slice id') { - binderSliceId = Number(item.strValue); - list.unshift({ - name: 'Name', - value: `
-
${name || 'binder'}
- -
`, - }); - } - list.push({ name: item.keyName, value: item.strValue }); - }); - if (binderSliceId === -1) { - list.unshift({ name: 'Name', value: name }); - } - this.addTabPanelContent(list, data); - this.currentSelectionTbl!.dataSource = list; - let funcClick = this.currentSelectionTbl?.shadowRoot?.querySelector('#function-jump'); - funcClick?.addEventListener('click', () => { - if (!Number.isNaN(binderSliceId) && binderSliceId !== -1) { - queryBinderBySliceId(binderSliceId).then((result: any[]) => { - if (result.length > 0) { - result[0].type = TraceRow.ROW_TYPE_FUNC; - scrollCallback(result[0]); - } - }); - } - }); - }); + this.handleBinder(data, list, name, scrollCallback); } else { - queryBinderArgsByArgset(data.argsetid).then((argset) => { - list.push({ name: 'Name', value: name }); - argset.forEach((item) => { - list.push({ name: item.keyName, value: item.strValue }); - }); - this.addTabPanelContent(list, data); - this.currentSelectionTbl!.dataSource = list; - }); + this.handleNonBinder(data, list, name); } } else { this.setTableHeight('auto'); - list.push({ name: 'Name', value: name }); + list.push({name: 'Name', value: name}); list.push({ name: 'StartTime(Relative)', value: getTimeString(data.startTs || 0), @@ -331,11 +281,97 @@ export class TabPaneCurrentSelection extends BaseElement { name: 'Duration', value: getTimeString(data.dur || 0), }); - list.push({ name: 'depth', value: data.depth }); + list.push({name: 'depth', value: data.depth}); this.currentSelectionTbl!.dataSource = list; } } + private handleNonBinder(data: FuncStruct, list: any[], name: string): void { + queryBinderArgsByArgset(data.argsetid!).then((argset) => { + list.push({name: 'Name', value: name}); + argset.forEach((item) => { + list.push({name: item.keyName, value: item.strValue}); + }); + this.addTabPanelContent(list, data); + this.currentSelectionTbl!.dataSource = list; + }); + } + + private handleBinder(data: FuncStruct, list: any[], name: string, scrollCallback: Function): void { + queryBinderArgsByArgset(data.argsetid!).then((argset) => { + let binderSliceId = -1; + argset.forEach((item) => { + if (item.keyName === 'destination slice id') { + binderSliceId = Number(item.strValue); + list.unshift({ + name: 'Name', + value: `
+
${name || 'binder'}
+ +
`, + }); + } + list.push({name: item.keyName, value: item.strValue}); + }); + if (binderSliceId === -1) { + list.unshift({name: 'Name', value: name}); + } + this.addTabPanelContent(list, data); + this.currentSelectionTbl!.dataSource = list; + let funcClick = this.currentSelectionTbl?.shadowRoot?.querySelector('#function-jump'); + funcClick?.addEventListener('click', () => { + if (!Number.isNaN(binderSliceId) && binderSliceId !== -1) { + queryBinderBySliceId(binderSliceId).then((result: any[]) => { + if (result.length > 0) { + result[0].type = TraceRow.ROW_TYPE_FUNC; + scrollCallback(result[0]); + } + }); + } + }); + }); + } + + private handleAsyncBinder(data: FuncStruct, list: any[], name: string, scrollCallback: Function): void { + Promise.all([ + queryBinderByArgsId(data.argsetid!, data.startTs!, !data.funName!.endsWith('rcv')), + queryBinderArgsByArgset(data.argsetid!), + ]).then((result) => { + let asyncBinderRes = result[0]; + let argsBinderRes = result[1]; + let asyncBinderStract: any; + if (asyncBinderRes.length > 0) { + asyncBinderRes[0].type = TraceRow.ROW_TYPE_FUNC; + asyncBinderStract = asyncBinderRes[0]; + } + if (argsBinderRes.length > 0) { + argsBinderRes.forEach((item) => { + list.push({ + name: item.keyName, + value: item.strValue, + }); + }); + } + if (asyncBinderStract !== undefined) { + list.unshift({ + name: 'Name', + value: `
+
${name || 'binder'}
+ +
`, + }); + } else { + list.unshift({name: 'Name', value: name}); + } + this.addTabPanelContent(list, data); + this.currentSelectionTbl!.dataSource = list; + let funcClick = this.currentSelectionTbl?.shadowRoot?.querySelector('#function-jump'); + funcClick?.addEventListener('click', () => { + scrollCallback(asyncBinderStract); + }); + }); + } + private addTabPanelContent(contentList: any[], data: FuncStruct): void { contentList.push({ name: 'StartTime(Relative)', @@ -349,9 +385,9 @@ export class TabPaneCurrentSelection extends BaseElement { name: 'Duration', value: getTimeString(data.dur || 0), }); - contentList.push({ name: 'depth', value: data.depth }); + contentList.push({name: 'depth', value: data.depth}); if (data.argsetid && data.argsetid > -1) { - contentList.push({ name: 'arg_set_id', value: data.argsetid }); + contentList.push({name: 'arg_set_id', value: data.argsetid}); } } @@ -367,8 +403,8 @@ export class TabPaneCurrentSelection extends BaseElement { private setTitleAndButtonStyle(): void { let rightTitle: HTMLElement | null | undefined = this?.shadowRoot?.querySelector('#rightTitle'); let rightButton: HTMLElement | null | undefined = this?.shadowRoot - ?.querySelector('#rightButton') - ?.shadowRoot?.querySelector('#custom-button'); + ?.querySelector('#rightButton') + ?.shadowRoot?.querySelector('#custom-button'); let rightStar: HTMLElement | null | undefined = this?.shadowRoot?.querySelector('#right-star'); if (rightTitle) { rightTitle.style.visibility = 'hidden'; @@ -394,7 +430,7 @@ export class TabPaneCurrentSelection extends BaseElement { name: 'Value', value: ColorUtils.formatNumberComma(data.value || 0), }); - list.push({ name: 'Duration', value: getTimeString(data.dur || 0) }); + list.push({name: 'Duration', value: getTimeString(data.dur || 0)}); this.currentSelectionTbl!.dataSource = list; } @@ -415,8 +451,8 @@ export class TabPaneCurrentSelection extends BaseElement { name: 'StartTime(Absolute)', value: ((data.startTime || 0) + (window as any).recordStartNS) / 1000000000 + 's', }); - list.push({ name: 'Value', value: data.value }); - list.push({ name: 'Delta', value: data.delta }); + list.push({name: 'Value', value: data.value}); + list.push({name: 'Delta', value: data.delta}); list.push({ name: 'Duration', value: getTimeString(data.duration || 0), @@ -441,12 +477,12 @@ export class TabPaneCurrentSelection extends BaseElement { name: 'StartTime(Absolute)', value: ((data.startNS || 0) + (window as any).recordStartNS) / 1000000000 + 's', }); - list.push({ name: 'Name', value: data.name }); - list.push({ name: 'Duration', value: getTimeString(data.dur || 0) }); + list.push({name: 'Name', value: data.name}); + list.push({name: 'Duration', value: getTimeString(data.dur || 0)}); queryBinderArgsByArgset(data.argSetId || 0).then((argsBinderRes) => { if (argsBinderRes.length > 0) { argsBinderRes.forEach((item) => { - list.push({ name: item.keyName, value: item.strValue }); + list.push({name: item.keyName, value: item.strValue}); }); } this.currentSelectionTbl!.dataSource = list; @@ -469,6 +505,189 @@ export class TabPaneCurrentSelection extends BaseElement { } let list: any[] = []; let jankJumperList = new Array(); + this.prepareThreadInfo(list, data); + let cpu = new CpuStruct(); + cpu.id = data.id; + cpu.startTime = data.startTime; + this.queryThreadDetails(data, list, jankJumperList, callback, scrollWakeUp, scrollCallback); + } + + private sortByNearData(nearData: any[], data: ThreadStruct, list: any[]): any[] { + let preData: any = undefined; + let nextData: any = undefined; + nearData.sort((near1, near2) => near1.startTime - near2.startTime).forEach((near) => { + if (near.itid === data.id) { + if (near.startTime < data.startTime!) { + preData = near; + list.push({ + name: 'Previous State', + value: `
+
${Utils.getEndState(near.state)}
+ +
`, + }); + } else { + nextData = near; + list.push({ + name: 'Next State', + value: `
+
${Utils.getEndState(near.state)}
+ +
`, + }); + } + } + }); + return [preData, nextData]; + } + + private setWakeupData(fromBean: WakeupBean | undefined, wakeUps: WakeupBean[], list: any[]): void { + if (fromBean !== null && fromBean !== undefined && fromBean.pid !== 0 && fromBean.tid !== 0) { + list.push({ + name: 'wakeup from tid', + value: `
+
${fromBean.tid}
+ +
`, + }); + } + if (wakeUps !== null) { + wakeUps.map((e) => { + list.push({ + name: 'wakeup tid', + value: `
+
${e.tid}
+ +
`, + }); + }); + } + } + + private queryThreadDetails( + data: ThreadStruct, + list: any[], + jankJumperList: ThreadTreeNode[], + callback: ((data: Array) => void) | undefined, + scrollWakeUp: (d: any) => (void | undefined), + scrollCallback: ((d: any) => void) | undefined + ): void { + Promise.all([ + 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!), + ]).then((result) => { + let fromBean = result[0]; + let wakeUps = result[1]; + let args = result[2]; + let [preData, nextData] = this.sortByNearData(result[3], data, list); + this.setWakeupData(fromBean, wakeUps, list); + let timeLineNode = new ThreadTreeNode(data.tid!, data.pid!, data.startTime!); + jankJumperList.push(timeLineNode); + if (args.length > 0) { + args.forEach((arg) => { + list.push({name: arg.keyName, value: arg.strValue}); + }); + } + this.currentSelectionTbl!.dataSource = list; + if (callback) { + callback(jankJumperList); + } + this.stateClickHandler(preData, nextData, data, scrollWakeUp, scrollCallback); + this.wakeupClickHandler(wakeUps, fromBean, scrollWakeUp); + }); + } + + private wakeupClickHandler( + wakeUps: WakeupBean[], + fromBean: WakeupBean | undefined, + scrollWakeUp: (d: any) => (void | undefined) + ): void { + this.currentSelectionTbl?.shadowRoot?.querySelector('#wakeup-from')?.addEventListener('click', () => { + //点击跳转,唤醒和被唤醒的 线程 + if (fromBean && scrollWakeUp) { + scrollWakeUp({ + processId: fromBean.pid, + tid: fromBean.tid, + startTime: fromBean.ts, + dur: fromBean.dur, + cpu: fromBean.cpu, + id: fromBean.itid, + state: 'Running', + argSetID: fromBean.argSetID, + }); + } + }); + if (wakeUps) { + wakeUps.map((up) => { + this.currentSelectionTbl?.shadowRoot?.querySelector(`#wakeup-${up.tid}`)?.addEventListener('click', () => { + //点击跳转,唤醒和被唤醒的 线程 + if (up && scrollWakeUp !== undefined) { + scrollWakeUp({ + processId: up.pid, + tid: up.tid, + startTime: up.ts, + dur: up.dur, + cpu: up.cpu, + id: up.itid, + state: up.state, + argSetID: up.argSetID, + }); + } + }); + }); + } + } + + private stateClickHandler( + preData: any, + nextData: any, + data: ThreadStruct, + scrollWakeUp: (d: any) => (void | undefined), + scrollCallback: ((d: any) => void) | undefined + ): void { + this.currentSelectionTbl?.shadowRoot?.querySelector('#next-state-click')?.addEventListener('click', () => { + if (nextData && scrollWakeUp !== undefined) { + scrollWakeUp({ + processId: nextData.pid, + tid: nextData.tid, + startTime: nextData.startTime, + dur: nextData.dur, + cpu: nextData.cpu, + id: nextData.itid, + state: nextData.state, + argSetID: nextData.argSetID, + }); + } + }); + + this.currentSelectionTbl?.shadowRoot?.querySelector('#previous-state-click')?.addEventListener('click', () => { + if (preData && scrollWakeUp !== undefined) { + scrollWakeUp({ + processId: preData.pid, + tid: preData.tid, + startTime: preData.startTime, + dur: preData.dur, + cpu: preData.cpu, + id: preData.itid, + state: preData.state, + argSetID: preData.argSetID, + }); + } + }); + + this.currentSelectionTbl?.shadowRoot?.querySelector('#state-click')?.addEventListener('click', () => { + //线程点击 + if (scrollCallback) { + scrollCallback(data); + } + }); + } + + private prepareThreadInfo(list: any[], data: ThreadStruct): void { list.push({ name: 'StartTime(Relative)', value: getTimeString(data.startTime || 0), @@ -477,7 +696,7 @@ export class TabPaneCurrentSelection extends BaseElement { name: 'StartTime(Absolute)', value: ((data.startTime || 0) + (window as any).recordStartNS) / 1000000000 + 's', }); - list.push({ name: 'Duration', value: getTimeString(data.dur || 0) }); + list.push({name: 'Duration', value: getTimeString(data.dur || 0)}); let state; if (data.state) { state = Utils.getEndState(data.state); @@ -496,11 +715,11 @@ export class TabPaneCurrentSelection extends BaseElement {
`, }); } else { - list.push({ name: 'State', value: `${state}` }); + list.push({name: 'State', value: `${state}`}); } let slice = Utils.SCHED_SLICE_MAP.get(`${data.id}-${data.startTime}`); if (slice) { - list.push({ name: 'Prio', value: `${slice.priority}` }); + list.push({name: 'Prio', value: `${slice.priority}`}); } let processName = Utils.PROCESS_MAP.get(data.pid!); if ( @@ -515,144 +734,6 @@ export class TabPaneCurrentSelection extends BaseElement { name: 'Process', value: this.transferString(processName ?? '') + ' [' + data.pid + '] ', }); - let cpu = new CpuStruct(); - cpu.id = data.id; - cpu.startTime = data.startTime; - Promise.all([ - 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!), - ]).then((result) => { - let fromBean = result[0]; - let wakeUps = result[1]; - let args = result[2]; - let nearData = result[3]; - let preData: any = undefined; - let nextData: any = undefined; - nearData.sort((near1, near2) => near1.startTime - near2.startTime).forEach((near) => { - if (near.itid === data.id) { - if (near.startTime < data.startTime!) { - preData = near; - list.push({ - name: 'Previous State', - value: `
-
${Utils.getEndState(near.state)}
- -
`, - }); - } else { - nextData = near; - list.push({ - name: 'Next State', - value: `
-
${Utils.getEndState(near.state)}
- -
`, - }); - } - } - }); - if (fromBean !== null && fromBean !== undefined && fromBean.pid !== 0 && fromBean.tid !== 0) { - list.push({ - name: 'wakeup from tid', - value: `
-
${fromBean.tid}
- -
`, - }); - } - if (wakeUps !== null) { - wakeUps.map((e) => { - list.push({ - name: 'wakeup tid', - value: `
-
${e.tid}
- -
`, - }); - }); - } - let timeLineNode = new ThreadTreeNode(data.tid!, data.pid!, data.startTime!); - jankJumperList.push(timeLineNode); - if (args.length > 0) { - args.forEach((arg) => { - list.push({ name: arg.keyName, value: arg.strValue }); - }); - } - this.currentSelectionTbl!.dataSource = list; - if (callback) { - callback(jankJumperList); - } - this.currentSelectionTbl?.shadowRoot?.querySelector('#next-state-click')?.addEventListener('click', () => { - if (nextData && scrollWakeUp !== undefined) { - scrollWakeUp({ - processId: nextData.pid, - tid: nextData.tid, - startTime: nextData.startTime, - dur: nextData.dur, - cpu: nextData.cpu, - id: nextData.itid, - state: nextData.state, - argSetID: nextData.argSetID, - }); - } - }); - this.currentSelectionTbl?.shadowRoot?.querySelector('#previous-state-click')?.addEventListener('click', () => { - if (preData && scrollWakeUp !== undefined) { - scrollWakeUp({ - processId: preData.pid, - tid: preData.tid, - startTime: preData.startTime, - dur: preData.dur, - cpu: preData.cpu, - id: preData.itid, - state: preData.state, - argSetID: preData.argSetID, - }); - } - }); - this.currentSelectionTbl?.shadowRoot?.querySelector('#state-click')?.addEventListener('click', () => { - //线程点击 - if (scrollCallback) { - scrollCallback(data); - } - }); - this.currentSelectionTbl?.shadowRoot?.querySelector('#wakeup-from')?.addEventListener('click', () => { - //点击跳转,唤醒和被唤醒的 线程 - if (fromBean && scrollWakeUp) { - scrollWakeUp({ - processId: fromBean.pid, - tid: fromBean.tid, - startTime: fromBean.ts, - dur: fromBean.dur, - cpu: fromBean.cpu, - id: fromBean.itid, - state: 'Running', - argSetID: fromBean.argSetID, - }); - } - }); - if (wakeUps) { - wakeUps.map((up) => { - this.currentSelectionTbl?.shadowRoot?.querySelector(`#wakeup-${up.tid}`)?.addEventListener('click', () => { - //点击跳转,唤醒和被唤醒的 线程 - if (up && scrollWakeUp !== undefined) { - scrollWakeUp({ - processId: up.pid, - tid: up.tid, - startTime: up.ts, - dur: up.dur, - cpu: up.cpu, - id: up.itid, - state: up.state, - argSetID: up.argSetID, - }); - } - }); - }); - } - }); } setJankData( @@ -666,174 +747,206 @@ export class TabPaneCurrentSelection extends BaseElement { let list: any[] = []; this.setJankCommonMessage(list, data); if (data.type == '0') { - this.setJankType(data, list); - let jankJumperList = new Array(); - if (data.frame_type === 'render_service') { - queryGpuDur(data.id!).then((it) => { - if (it.length > 0) { - list.push({ name: 'Gpu Duration', value: getTimeString(it[0].gpu_dur) }); - } - }); - if (data.src_slice) { - queryFlowsData(data.src_slice!.split(',')).then((it) => { - if (it.length > 0) { - list.push({ - name: 'FrameTimeLine flows', - value: '', - }); - it.forEach((a: any) => { - let appNode = new JankTreeNode(a.name, a.pid, 'app'); - appNode.children.push(new JankTreeNode(a.name, a.pid, 'frameTime')); - jankJumperList.push(appNode); - list.push({ - name: 'Slice', - value: - a.cmdline + - ' [' + - a.name + - ']' + - ``, - }); - }); - list.push({ - name: 'Following flows', - value: '', - }); - it.forEach((a: any) => { - list.push({ - name: 'Slice', - value: - a.cmdline + - ' [' + - a.name + - ']' + - ``, - }); - }); - this.currentSelectionTbl!.dataSource = list; - this.addJankScrollCallBackEvent(scrollCallback, callback, jankJumperList); - } - }); - } else { - this.currentSelectionTbl!.dataSource = list; + this.handleTypeJank(data, list, scrollCallback, callback); + } else { + this.currentSelectionTbl!.dataSource = list; + } + } + + private handleTypeJank(data: JankStruct, list: any[], scrollCallback: ((d: any) => void) | undefined, + callback: ((data: Array) => void) | undefined): void { + this.setJankType(data, list); + let jankJumperList = new Array(); + if (data.frame_type === 'render_service') { + queryGpuDur(data.id!).then((it) => { + if (it.length > 0) { + list.push({name: 'Gpu Duration', value: getTimeString(it[0].gpu_dur)}); } - } else if (data.frame_type === 'app') { - list.push({ - name: 'FrameTimeLine flows', - value: '', - }); + }); + this.handleRenderServiceJank(data, list, jankJumperList, scrollCallback, callback); + } else if (data.frame_type === 'app') { + this.handleAppJank(list, data, jankJumperList, scrollCallback, callback); + } else if (data.frame_type === 'frameTime') { + this.handleFrameTimeJank(data, list, jankJumperList, scrollCallback, callback); + } + } + + private handleFrameTimeJank(data: JankStruct, list: any[], jankJumperList: JankTreeNode[], + scrollCallback: ((d: any) => void) | undefined, callback: ((data: Array) => void) | undefined): void { + queryGpuDur(data.id!).then((it) => { + if (it.length > 0) { list.push({ - name: 'Slice', - value: - data.cmdline + - ' [' + - data.name + - ']' + - ``, + name: 'Gpu Duration', + value: getTimeString(it[0].gpu_dur), }); - let timeLineNode = new JankTreeNode(data.name!, data.pid!, 'frameTime'); - jankJumperList.push(timeLineNode); - if (data.dst_slice) { - queryPrecedingData(data.dst_slice).then((it) => { - if (it.length > 0) { - list.push({ - name: 'Preceding flows', - value: '', - }); - it.forEach((a: any) => { - let rsNode = new JankTreeNode(a.name, a.pid, 'render_service'); - jankJumperList.push(rsNode); - list.push({ - name: 'Slice', - value: - a.cmdline + - ' [' + - a.name + - ']' + - ``, - }); - }); - this.currentSelectionTbl!.dataSource = list; - this.addJankScrollCallBackEvent(scrollCallback, callback, jankJumperList); - } + } + this.addAppFrameDetails(data, list); + this.addRenderServiceFrameDetails(data, list); + this.addFollowingDetails(list, data); + let appNode = new JankTreeNode(data.name!, data.pid!, 'app'); + let rsNode = new JankTreeNode(data.rs_vsync!, data.rs_pid!, 'render_service'); + appNode.children.push(rsNode); + jankJumperList.push(appNode); + this.currentSelectionTbl!.dataSource = list; + this.addJankScrollCallBackEvent(scrollCallback, callback, jankJumperList); + }); + } + + private addRenderServiceFrameDetails(data: JankStruct, list: any[]): void { + if (data.rs_name) { + list.push({ + name: 'RenderService Frame', + value: '', + }); + list.push({ + name: 'Process', + value: 'render_service ' + data.rs_pid, + }); + list.push({ + name: 'StartTime(Relative)', + value: getTimeString(data.rs_ts || 0), + }); + list.push({ + name: 'StartTime(Absolute)', + value: ((data.rs_ts || 0) + (window as any).recordStartNS) / 1000000000 + 's', + }); + list.push({ + name: 'end time', + value: getTimeString(data.rs_ts! + data.rs_dur! || 0), + }); + } + } + + private addFollowingDetails(list: any[], data: JankStruct): void { + list.push({ + name: 'Following', + value: '', + }); + list.push({ + name: 'Slice', + value: + data.cmdline + + ' [' + + data.name + + ']' + + ``, + }); + } + + private addAppFrameDetails(data: JankStruct, list: any[]): void { + if (data.name) { + list.push({ + name: 'App Frame', + value: '', + }); + list.push({ + name: 'Process', + value: data.cmdline + ' ' + data.pid, + }); + list.push({ + name: 'StartTime(Relative)', + value: getTimeString(data.ts || 0), + }); + list.push({ + name: 'StartTime(Absolute)', + value: ((data.ts || 0) + (window as any).recordStartNS) / 1000000000 + 's', + }); + list.push({ + name: 'end time', + value: getTimeString(data!.ts! + data.dur! || 0), + }); + } + } + + private handleAppJank(list: any[], data: JankStruct, jankJumperList: JankTreeNode[], + scrollCallback: ((d: any) => void) | undefined, callback: ((data: Array) => void) | undefined): void { + list.push({ + name: 'FrameTimeLine flows', + value: '', + }); + list.push({ + name: 'Slice', + value: + data.cmdline + + ' [' + + data.name + + ']' + + ``, + }); + let timeLineNode = new JankTreeNode(data.name!, data.pid!, 'frameTime'); + jankJumperList.push(timeLineNode); + if (data.dst_slice) { + queryPrecedingData(data.dst_slice).then((it) => { + if (it.length > 0) { + list.push({ + name: 'Preceding flows', + value: '', + }); + it.forEach((a: any) => { + let rsNode = new JankTreeNode(a.name, a.pid, 'render_service'); + jankJumperList.push(rsNode); + list.push({ + name: 'Slice', + value: + a.cmdline + + ' [' + + a.name + + ']' + + ``, + }); }); - } else { this.currentSelectionTbl!.dataSource = list; this.addJankScrollCallBackEvent(scrollCallback, callback, jankJumperList); } - } else if (data.frame_type === 'frameTime') { - queryGpuDur(data.id!).then((it) => { - if (it.length > 0) { - list.push({ - name: 'Gpu Duration', - value: getTimeString(it[0].gpu_dur), - }); - } - if (data.name) { - list.push({ - name: 'App Frame', - value: '', - }); - list.push({ - name: 'Process', - value: data.cmdline + ' ' + data.pid, - }); - list.push({ - name: 'StartTime(Relative)', - value: getTimeString(data.ts || 0), - }); - list.push({ - name: 'StartTime(Absolute)', - value: ((data.ts || 0) + (window as any).recordStartNS) / 1000000000 + 's', - }); - list.push({ - name: 'end time', - value: getTimeString(data!.ts! + data.dur! || 0), - }); - } - if (data.rs_name) { - list.push({ - name: 'RenderService Frame', - value: '', - }); - list.push({ - name: 'Process', - value: 'render_service ' + data.rs_pid, - }); - list.push({ - name: 'StartTime(Relative)', - value: getTimeString(data.rs_ts || 0), - }); - list.push({ - name: 'StartTime(Absolute)', - value: ((data.rs_ts || 0) + (window as any).recordStartNS) / 1000000000 + 's', - }); + }); + } else { + this.currentSelectionTbl!.dataSource = list; + this.addJankScrollCallBackEvent(scrollCallback, callback, jankJumperList); + } + } + + private handleRenderServiceJank(data: JankStruct, list: any[], jankJumperList: JankTreeNode[], + scrollCallback: ((d: any) => void) | undefined, callback: ((data: Array) => void) | undefined): void { + if (data.src_slice) { + queryFlowsData(data.src_slice!.split(',')).then((it) => { + if (it.length > 0) { + list.push({ + name: 'FrameTimeLine flows', + value: '', + }); + it.forEach((a: any) => { + let appNode = new JankTreeNode(a.name, a.pid, 'app'); + appNode.children.push(new JankTreeNode(a.name, a.pid, 'frameTime')); + jankJumperList.push(appNode); list.push({ - name: 'end time', - value: getTimeString(data.rs_ts! + data.rs_dur! || 0), + name: 'Slice', + value: + a.cmdline + + ' [' + + a.name + + ']' + + ``, }); - } + }); list.push({ - name: 'Following', + name: 'Following flows', value: '', }); - list.push({ - name: 'Slice', - value: - data.cmdline + - ' [' + - data.name + - ']' + - ``, + it.forEach((a: any) => { + list.push({ + name: 'Slice', + value: + a.cmdline + + ' [' + + a.name + + ']' + + ``, + }); }); - let appNode = new JankTreeNode(data.name!, data.pid!, 'app'); - let rsNode = new JankTreeNode(data.rs_vsync!, data.rs_pid!, 'render_service'); - appNode.children.push(rsNode); - jankJumperList.push(appNode); this.currentSelectionTbl!.dataSource = list; this.addJankScrollCallBackEvent(scrollCallback, callback, jankJumperList); - }); - } + } + }); } else { this.currentSelectionTbl!.dataSource = list; } @@ -851,7 +964,7 @@ export class TabPaneCurrentSelection extends BaseElement { allStartUpLeftTitle.innerText = 'Details'; } let list: any[] = []; - list.push({ name: 'Name', value: data.stepName! }); + list.push({name: 'Name', value: data.stepName!}); list.push({ name: 'StartTime(Relative)', value: getTimeString(data.startTs || 0), @@ -878,20 +991,9 @@ export class TabPaneCurrentSelection extends BaseElement { setStartupData(data: AppStartupStruct, scrollCallback: Function): void { this.setTableHeight('550px'); this.initCanvas(); - let rightButton: HTMLElement | null | undefined = this?.shadowRoot - ?.querySelector('#rightButton') - ?.shadowRoot?.querySelector('#custom-button'); - let startUpRightTitle: HTMLElement | null | undefined = this?.shadowRoot?.querySelector('#rightTitle'); - if (startUpRightTitle) { - startUpRightTitle.style.visibility = 'hidden'; - rightButton!.style.visibility = 'hidden'; - } - let startUpLeftTitle: HTMLElement | null | undefined = this?.shadowRoot?.querySelector('#leftTitle'); - if (startUpLeftTitle) { - startUpLeftTitle.innerText = 'Details'; - } + this.setStartUpStyle(); let list: any[] = []; - list.push({ name: 'Name', value: AppStartupStruct.getStartupName(data.startName) }); + list.push({name: 'Name', value: AppStartupStruct.getStartupName(data.startName)}); list.push({ name: 'StartTime(Relative)', value: ` @@ -926,8 +1028,27 @@ export class TabPaneCurrentSelection extends BaseElement { value: 'Unknown Time', }); } - list.push({ name: 'Duration', value: getTimeString(data.dur || 0) }); + list.push({name: 'Duration', value: getTimeString(data.dur || 0)}); this.currentSelectionTbl!.dataSource = list; + this.attachScrollHandlers(data, scrollCallback); + } + + private setStartUpStyle() { + let rightButton: HTMLElement | null | undefined = this?.shadowRoot + ?.querySelector('#rightButton') + ?.shadowRoot?.querySelector('#custom-button'); + let startUpRightTitle: HTMLElement | null | undefined = this?.shadowRoot?.querySelector('#rightTitle'); + if (startUpRightTitle) { + startUpRightTitle.style.visibility = 'hidden'; + rightButton!.style.visibility = 'hidden'; + } + let startUpLeftTitle: HTMLElement | null | undefined = this?.shadowRoot?.querySelector('#leftTitle'); + if (startUpLeftTitle) { + startUpLeftTitle.innerText = 'Details'; + } + } + + private attachScrollHandlers(data: AppStartupStruct, scrollCallback: Function): void { let startIcon = this.currentSelectionTbl?.shadowRoot?.querySelector('#start-jump'); let endIcon = this.currentSelectionTbl?.shadowRoot?.querySelector('#end-jump'); let scrollClick = (type: number): void => { @@ -938,7 +1059,13 @@ export class TabPaneCurrentSelection extends BaseElement { useEnd ? recordNs + data.startTs! + data.dur! : recordNs + data.startTs! ).then((result) => { if (result.length > 0) { - let pt: { pid: number; tid: number; dur: number; name: string; depth: number } = result[0]; + let pt: { + pid: number; + tid: number; + dur: number; + name: string; + depth: number + } = result[0]; scrollCallback({ pid: pt.pid, tid: pt.tid, @@ -963,20 +1090,9 @@ export class TabPaneCurrentSelection extends BaseElement { setStaticInitData(data: SoStruct, scrollCallback: Function): void { this.setTableHeight('550px'); this.initCanvas(); - let rightTitle: HTMLElement | null | undefined = this?.shadowRoot?.querySelector('#rightTitle'); - let rightButton: HTMLElement | null | undefined = this?.shadowRoot - ?.querySelector('#rightButton') - ?.shadowRoot?.querySelector('#custom-button'); - if (rightTitle) { - rightTitle.style.visibility = 'hidden'; - rightButton!.style.visibility = 'hidden'; - } - let leftTitle: HTMLElement | null | undefined = this?.shadowRoot?.querySelector('#leftTitle'); - if (leftTitle) { - leftTitle.innerText = 'Details'; - } + this.setStaticInitStyle(); let list: any[] = []; - list.push({ name: 'Name', value: data.soName }); + list.push({name: 'Name', value: data.soName}); list.push({ name: 'StartTime(Relative)', value: `
@@ -988,15 +1104,40 @@ export class TabPaneCurrentSelection extends BaseElement { name: 'StartTime(Absolute)', value: ((data.startTs || 0) + (window as any).recordStartNS) / 1000000000 + 's', }); - list.push({ name: 'Duration', value: getTimeString(data.dur || 0) }); + list.push({name: 'Duration', value: getTimeString(data.dur || 0)}); this.currentSelectionTbl!.dataSource = list; + this.startIconClickEvent(data, scrollCallback); + } + + private setStaticInitStyle(): void { + let rightTitle: HTMLElement | null | undefined = this?.shadowRoot?.querySelector('#rightTitle'); + let rightButton: HTMLElement | null | undefined = this?.shadowRoot + ?.querySelector('#rightButton') + ?.shadowRoot?.querySelector('#custom-button'); + if (rightTitle) { + rightTitle.style.visibility = 'hidden'; + rightButton!.style.visibility = 'hidden'; + } + let leftTitle: HTMLElement | null | undefined = this?.shadowRoot?.querySelector('#leftTitle'); + if (leftTitle) { + leftTitle.innerText = 'Details'; + } + } + + private startIconClickEvent(data: SoStruct, scrollCallback: Function): void { let startIcon = this.currentSelectionTbl?.shadowRoot?.querySelector('#start-jump'); if (startIcon) { startIcon.addEventListener('click', () => { let recordNs: number = (window as any).recordStartNS; queryThreadByItid(data.itid!, recordNs + data.startTs!).then((result) => { if (result.length > 0) { - let pt: { pid: number; tid: number; dur: number; name: string; depth: number } = result[0]; + let pt: { + pid: number; + tid: number; + dur: number; + name: string; + depth: number + } = result[0]; scrollCallback({ pid: pt.pid, tid: pt.tid, @@ -1018,27 +1159,30 @@ export class TabPaneCurrentSelection extends BaseElement { this.tabCurrentSelectionInit('Animation Details'); let list = []; let dataTs: number = data.startTs < 0 ? 0 : data.startTs; - list.push({ name: 'Name', value: data.name }); - list.push({ name: 'Start time(Relative)', value: `${Utils.getTimeString(dataTs)}` }); + list.push({name: 'Name', value: data.name}); + list.push({name: 'Start time(Relative)', value: `${Utils.getTimeString(dataTs)}`}); list.push({ name: 'Start time(Absolute)', value: ((dataTs || 0) + (window as any).recordStartNS) / 1000000000 + 's', }); - list.push({ name: 'End time(Relative)', value: `${Utils.getTimeString(dataTs + (data.dur || 0))}` }); + list.push({ + name: 'End time(Relative)', + value: `${Utils.getTimeString(dataTs + (data.dur || 0))}` + }); list.push({ name: 'End time(Absolute)', value: (dataTs + (data.dur || 0) + (window as any).recordStartNS) / 1000000000 + 's', }); - list.push({ name: 'Duration', value: `${Utils.getTimeString(data.dur || 0)}` }); + list.push({name: 'Duration', value: `${Utils.getTimeString(data.dur || 0)}`}); if (data.status === 'Completion delay') { let frameFpsMessage = data.frameInfo?.split(':'); if (frameFpsMessage) { if (frameFpsMessage[1] !== '0') { - list.push({ name: 'FPS', value: `${frameFpsMessage[1]}` }); + list.push({name: 'FPS', value: `${frameFpsMessage[1]}`}); } else { let fixedNumber: number = 2; let fpsValue: number = Number(frameFpsMessage[0]) / (data.dur / 1000_000_000); - list.push({ name: 'FPS', value: `${fpsValue.toFixed(fixedNumber) || 0}` }); + list.push({name: 'FPS', value: `${fpsValue.toFixed(fixedNumber) || 0}`}); } } } @@ -1048,29 +1192,29 @@ export class TabPaneCurrentSelection extends BaseElement { private setJankType(data: JankStruct, list: any[]): void { if (data.jank_tag === 1) { if (data.frame_type === 'render_service') { - list.push({ name: 'Jank Type', value: 'RenderService Deadline Missed' }); + list.push({name: 'Jank Type', value: 'RenderService Deadline Missed'}); } else if (data.frame_type === 'app') { - list.push({ name: 'Jank Type', value: 'APP Deadline Missed' }); + list.push({name: 'Jank Type', value: 'APP Deadline Missed'}); } else if (data.frame_type === 'frameTime') { - list.push({ name: 'Jank Type', value: 'Deadline Missed' }); + list.push({name: 'Jank Type', value: 'Deadline Missed'}); } } else if (data.jank_tag === 3) { - list.push({ name: 'Jank Type', value: 'Deadline Missed' }); + list.push({name: 'Jank Type', value: 'Deadline Missed'}); } else { - list.push({ name: 'Jank Type', value: 'NONE' }); + list.push({name: 'Jank Type', value: 'NONE'}); } } private setJankCommonMessage(list: any[], data: JankStruct): void { - list.push({ name: 'Name', value: data.name }); - list.push({ name: 'StartTime(Relative)', value: getTimeString(data.ts || 0) }); + list.push({name: 'Name', value: data.name}); + list.push({name: 'StartTime(Relative)', value: getTimeString(data.ts || 0)}); list.push({ name: 'StartTime(Absolute)', value: ((data.ts || 0) + (window as any).recordStartNS) / 1000000000 + 's', }); - list.push({ name: 'Duration', value: data.dur ? getTimeString(data.dur) : ' ' }); + list.push({name: 'Duration', value: data.dur ? getTimeString(data.dur) : ' '}); if (data.frame_type !== 'frameTime') { - list.push({ name: 'Process', value: data.cmdline + ' ' + data.pid }); + list.push({name: 'Process', value: data.cmdline + ' ' + data.pid}); } } @@ -1211,17 +1355,7 @@ export class TabPaneCurrentSelection extends BaseElement { let context = cavs.getContext('2d'); if (context !== null) { //绘制竖线 - if (document.querySelector('sp-application')!.dark) { - context.strokeStyle = '#ffffff'; - context.fillStyle = '#ffffff'; - } else { - context.strokeStyle = '#000000'; - context.fillStyle = '#000000'; - } - context.lineWidth = 2; - context.moveTo(10, 15); - context.lineTo(10, 125); - context.stroke(); + this.drawVerticalLine(context); //绘制菱形 context.lineWidth = 1; context.beginPath(); @@ -1266,6 +1400,20 @@ export class TabPaneCurrentSelection extends BaseElement { } } + private drawVerticalLine(context: CanvasRenderingContext2D): void { + if (document.querySelector('sp-application')!.dark) { + context.strokeStyle = '#ffffff'; + context.fillStyle = '#ffffff'; + } else { + context.strokeStyle = '#000000'; + context.fillStyle = '#000000'; + } + context.lineWidth = 2; + context.moveTo(10, 15); + context.lineTo(10, 125); + context.stroke(); + } + transferString(str: string): string { let s = ''; if (str.length === 0) { @@ -1283,7 +1431,8 @@ export class TabPaneCurrentSelection extends BaseElement { this.currentSelectionTbl = this.shadowRoot?.querySelector('#selectionTbl'); this.wakeupListTbl = this.shadowRoot?.querySelector('#wakeupListTbl'); this.scrollView = this.shadowRoot?.querySelector('#scroll_view'); - this.currentSelectionTbl?.addEventListener('column-click', (ev: any) => {}); + this.currentSelectionTbl?.addEventListener('column-click', (ev: any) => { + }); window.subscribe(window.SmartEvent.UI.WakeupList, (data: Array) => this.showWakeupListTableData(data)); } @@ -1331,17 +1480,21 @@ export class TabPaneCurrentSelection extends BaseElement { maxPriorityDuration = Math.max(it.dur || 0, maxPriorityDuration); } }); - this.wakeupListTbl!.getItemTextColor = (data: any) => { - if ((data.priority === maxPriority && data.dur === maxPriorityDuration) || data.dur === maxDuration) { - return '#f44336'; - } else { - return '#262626'; - } - }; + this.updateTableSettings(maxPriority, maxPriorityDuration, maxDuration); this.wakeupListTbl!.recycleDataSource = resource; }); } + private updateTableSettings(maxPriority: number, maxPriorityDuration: number, maxDuration: number) { + this.wakeupListTbl!.getItemTextColor = (data: any) => { + if ((data.priority === maxPriority && data.dur === maxPriorityDuration) || data.dur === maxDuration) { + return '#f44336'; + } else { + return '#262626'; + } + }; + } + addTableObserver(): void { let leftTable = this.shadowRoot?.querySelector('.table-left'); this.tableObserver?.observe(leftTable!, { @@ -1352,104 +1505,7 @@ export class TabPaneCurrentSelection extends BaseElement { } initHtml(): string { - return ` - -
-
-
-

-
-

Scheduling Latency

-
- GetWakeupList - -
-
-
-
-
- - - - - - - - -
- - -
-
-
-
- `; + return TabPaneCurrentSelectionHtml; } } @@ -1472,6 +1528,7 @@ export class ThreadTreeNode { tid: number = 0; pid: number = -1; startTime: number = 1; + constructor(tid: number, pid: number, startTime: number) { this.tid = tid; this.pid = pid; diff --git a/ide/src/trace/component/trace/sheet/TabPaneFilter.html.ts b/ide/src/trace/component/trace/sheet/TabPaneFilter.html.ts new file mode 100644 index 00000000..355c184f --- /dev/null +++ b/ide/src/trace/component/trace/sheet/TabPaneFilter.html.ts @@ -0,0 +1,328 @@ +/* + * Copyright (C) 2022 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. + */ + +let inputPlace = ''; + +let html = ` + + +Input Filter + + +
+ +
+ +
+
Invert
+
Hide System so
+
Hide Event
+
Hide Thread
+
Hide Thread State
+
+ Options +
+ +
+ Options +
+ +
+ + + +
+
Constraints:Only enabled with data and while stopped;
+
filters data to thresholds.
+
+ +
+
+ Sample Count Filter +
+ +
+
+ +
+
+
Reset
+
+
+ Symbol Filter +
+ +
+ +
+Transfer +
+ +
+
+ +
+
+
Reset
+
+
+ Library Filter +
+
+ +
Statistics by Thread
+
+` +export const TabPaneFilterHtml = (input: string): string => { + inputPlace = input; + return html; +} diff --git a/ide/src/trace/component/trace/sheet/TabPaneFilter.ts b/ide/src/trace/component/trace/sheet/TabPaneFilter.ts index 7b127234..dd0521e9 100644 --- a/ide/src/trace/component/trace/sheet/TabPaneFilter.ts +++ b/ide/src/trace/component/trace/sheet/TabPaneFilter.ts @@ -22,6 +22,7 @@ import '../../../../base-ui/popover/LitPopoverV'; import { LitCheckBox } from '../../../../base-ui/checkbox/LitCheckBox'; import { LitSelect } from '../../../../base-ui/select/LitSelect'; import {queryTransferList} from "../../../database/sql/Perf.sql"; +import { TabPaneFilterHtml } from './TabPaneFilter.html'; export interface FilterData { inputValue: string; @@ -119,82 +120,22 @@ export class TabPaneFilter extends BaseElement { this.iconEL = this.shadowRoot?.querySelector('#icon'); this.statisticsName = this.shadowRoot?.querySelector('.statistics-name'); let transferEL = this.shadowRoot?.querySelector('.transfer-text'); - this.iconEL!.onclick = (e): void => { - if (this.iconEL!.name === 'statistics') { - this.iconEL!.name = 'menu'; - this.iconEL!.size = 18; - if (this.getFilter) { - this.getFilter(this.filterData('icon')); - } - if (this.getAttribute('perf') === 'perf') { - this.disabledTransfer(false); - } - } else if (this.iconEL!.name === 'menu') { - this.iconEL!.name = 'statistics'; - this.iconEL!.size = 16; - if (this.getFilter) { - this.getFilter(this.filterData('icon')); - } - if (this.getAttribute('perf') === 'perf') { - this.disabledTransfer(true); - } - } - }; - transferEL!.onclick = (): void => { this.getTransferList(); }; - - this.markButtonEL!.onclick = (e: MouseEvent): void => { - if (this.getFilter) { - this.getFilter(this.filterData('mark', { mark: true })); - } - }; - - this.filterInputEL?.addEventListener('keyup', (event: any): void => { - if (event.keyCode === 13) { - if (this.getFilter) { - this.getFilter( - this.filterData('inputValue', { - inputValue: event.target.value, - }) - ); - } - } - event.stopPropagation(); - }); - - this.filterInputEL?.addEventListener('keypress', (event: any): void => { - event.stopPropagation(); - }); - this.setSelectList(); - this.initializeCallTree(); - this.initializeTreeConstraints(); - this.initializeMining(); - this.initializeLibrary(); + this.initBaseElListener(); + this.queryElListener(); + } + private queryElListener(): void { this.shadowRoot!.querySelectorAll('.mining-button').forEach( (e: HTMLDivElement, idx: number): void => { - e!.onclick = (ev): void => { - if (idx === 0) { - const restoreList = this.cutList!.filter((item: any): boolean => item.highlight === true); - const list = this.cutList!.filter((item): boolean => item.highlight === false); - this.cutList = list; - if (this.getMining) { - this.getMining({ - type: 'button', - item: 'restore', - remove: restoreList, - }); - } - this.initializeMining(); - } - }; + this.miningButtonClickListener(e, idx); } ); this.shadowRoot!.querySelector('.library-button')!.onclick = (ev): void => { @@ -210,7 +151,6 @@ export class TabPaneFilter extends BaseElement { } this.initializeLibrary(); }; - this.shadowRoot!.querySelector('#data-mining')!.onclick = (e): void => { if (this.getMining) { this.getMining({ type: 'button', item: 'symbol' }); @@ -230,6 +170,66 @@ export class TabPaneFilter extends BaseElement { }; } + private initBaseElListener(): void { + this.iconEL!.onclick = (): void => { + if (this.iconEL!.name === 'statistics') { + this.iconEL!.name = 'menu'; + this.iconEL!.size = 18; + if (this.getFilter) { + this.getFilter(this.filterData('icon')); + } + if (this.getAttribute('perf') === 'perf') { + this.disabledTransfer(false); + } + } else if (this.iconEL!.name === 'menu') { + this.iconEL!.name = 'statistics'; + this.iconEL!.size = 16; + if (this.getFilter) { + this.getFilter(this.filterData('icon')); + } + if (this.getAttribute('perf') === 'perf') { + this.disabledTransfer(true); + } + } + }; + this.markButtonEL!.onclick = (): void => { + if (this.getFilter) { + this.getFilter(this.filterData('mark', { mark: true })); + } + } + this.filterInputEL?.addEventListener('keyup', (event: any): void => { + if (event.keyCode === 13 && this.getFilter) { + this.getFilter( + this.filterData('inputValue', { + inputValue: event.target.value, + }) + ); + } + event.stopPropagation(); + }); + this.filterInputEL?.addEventListener('keypress', (event: any): void => { + event.stopPropagation(); + }); + } + + private miningButtonClickListener(e: HTMLDivElement, idx: number): void { + e!.onclick = (ev): void => { + if (idx === 0) { + const restoreList = this.cutList!.filter((item: any): boolean => item.highlight === true); + const list = this.cutList!.filter((item): boolean => item.highlight === false); + this.cutList = list; + if (this.getMining) { + this.getMining({ + type: 'button', + item: 'restore', + remove: restoreList, + }); + } + this.initializeMining(); + } + }; + } + set firstSelect(value: string) { this.firstSelectEL!.value = value; } @@ -336,41 +336,9 @@ export class TabPaneFilter extends BaseElement { ): void { let sLE = this.shadowRoot?.querySelector('#load'); let html = ``; - if (firstList) { - html += ``; - if (firstTitle != '') { - html += `${firstTitle}`; - } - firstList!.forEach((a, b) => { - html += `${a}`; - }); - html += ``; - } - if (secondList) { - html += ``; - if (secondTitle != '') { - html += `${secondTitle}`; - } - secondList!.forEach((a, b) => { - html += `${a}`; - }); - html += ``; - } - let thtml = ''; - if (thirdList) { - this.setAttribute('third', ''); - } - thtml += ``; - if (thirdList) { - if (thirdTitle !== '') { - thtml += `${thirdTitle}`; - } - thirdList!.forEach((a, b) => { - thtml += `${a}`; - }); - } - thtml += ``; - + html = this.getSelectFirstListHtml(firstTitle, firstList, html); + html = this.getSelectSecondListHtml(secondTitle, secondList, html); + let thtml = this.getSelectThirdListHtml(thirdTitle, thirdList); if (!firstList && !secondList) { this.thirdSelectEL!.outerHTML = thtml; this.thirdSelectEL = this.shadowRoot?.querySelector('#third-select'); @@ -381,7 +349,6 @@ export class TabPaneFilter extends BaseElement { }; return; } - if (!firstList) { this.secondSelectEL!.outerHTML = html; } else if (!secondList) { @@ -395,7 +362,56 @@ export class TabPaneFilter extends BaseElement { this.firstSelectEL = this.shadowRoot?.querySelector('#first-select'); this.secondSelectEL = this.shadowRoot?.querySelector('#second-select'); + this.initSelectElListener(); + } + + private getSelectThirdListHtml(thirdTitle: string, thirdList: Array | null | undefined): string { + let thtml = ''; + if (thirdList) { + this.setAttribute('third', ''); + } + thtml += ``; + if (thirdList) { + if (thirdTitle !== '') { + thtml += `${thirdTitle}`; + } + thirdList!.forEach((a, b) => { + thtml += `${a}`; + }); + } + thtml += ``; + return thtml; + } + private getSelectSecondListHtml(secondTitle: string, secondList: Array | null | undefined, html: string): string { + if (secondList) { + html += ``; + if (secondTitle != '') { + html += `${secondTitle}`; + } + secondList!.forEach((a, b) => { + html += `${a}`; + }); + html += ``; + } + return html; + } + + private getSelectFirstListHtml(firstTitle: string, firstList: Array | null | undefined, html: string): string { + if (firstList) { + html += ``; + if (firstTitle != '') { + html += `${firstTitle}`; + } + firstList!.forEach((a, b) => { + html += `${a}`; + }); + html += ``; + } + return html; + } + + private initSelectElListener(): void{ this.firstSelectEL!.onchange = (e): void => { if (this.getFilter) { this.getFilter(this.filterData('firstSelect')); @@ -423,129 +439,34 @@ export class TabPaneFilter extends BaseElement { } } + private treeCheckClickSwitch(idx: number, check: boolean, row: NodeListOf): void{ + let checkList = []; + for (let index = 0; index < 5; index++) { + if (idx === index) { + checkList.push(row[index].querySelector('lit-check-box')!.checked) + } else { + checkList.push(check); + } + } + this.getCallTree!({ + checks: [checkList[0], checkList[1], checkList[2], checkList[3], checkList[4]], + value: idx, + }); + } + initializeCallTree() { let row = this.shadowRoot!.querySelectorAll('.tree-check'); row.forEach((e, idx): void => { let check = e.querySelector('lit-check-box'); e.querySelector('div')!.onclick = (ev): void => { if (this.getCallTree) { - if (idx === 0) { - this.getCallTree({ - checks: [ - !check!.checked, - row[1].querySelector('lit-check-box')!.checked, - row[2].querySelector('lit-check-box')!.checked, - row[3].querySelector('lit-check-box')!.checked, - row[4].querySelector('lit-check-box')!.checked, - ], - value: idx, - }); - } else if (idx === 1) { - this.getCallTree({ - checks: [ - row[0].querySelector('lit-check-box')!.checked, - !check!.checked, - row[2].querySelector('lit-check-box')!.checked, - row[3].querySelector('lit-check-box')!.checked, - row[4].querySelector('lit-check-box')!.checked, - ], - value: idx, - }); - } else if (idx === 2) { - this.getCallTree({ - checks: [ - row[0].querySelector('lit-check-box')!.checked, - row[1].querySelector('lit-check-box')!.checked, - !check!.checked, - row[3].querySelector('lit-check-box')!.checked, - row[4].querySelector('lit-check-box')!.checked, - ], - value: idx, - }); - } else if (idx === 3) { - this.getCallTree({ - checks: [ - row[0].querySelector('lit-check-box')!.checked, - row[1].querySelector('lit-check-box')!.checked, - row[2].querySelector('lit-check-box')!.checked, - !check!.checked, - row[4].querySelector('lit-check-box')!.checked, - ], - value: idx, - }); - } else if (idx === 4) { - this.getCallTree({ - checks: [ - row[0].querySelector('lit-check-box')!.checked, - row[1].querySelector('lit-check-box')!.checked, - row[2].querySelector('lit-check-box')!.checked, - row[3].querySelector('lit-check-box')!.checked, - !check!.checked, - ], - value: idx, - }); - } + this.treeCheckClickSwitch(idx, !check!.checked, row); } check!.checked = !check!.checked; }; check!.onchange = (ev: any): void => { if (this.getCallTree) { - if (idx === 0) { - this.getCallTree({ - checks: [ - ev.target.checked, - row[1].querySelector('lit-check-box')!.checked, - row[2].querySelector('lit-check-box')!.checked, - row[3].querySelector('lit-check-box')!.checked, - row[4].querySelector('lit-check-box')!.checked, - ], - value: idx, - }); - } else if (idx === 1) { - this.getCallTree({ - checks: [ - row[0].querySelector('lit-check-box')!.checked, - ev.target.checked, - row[2].querySelector('lit-check-box')!.checked, - row[3].querySelector('lit-check-box')!.checked, - row[4].querySelector('lit-check-box')!.checked, - ], - value: idx, - }); - } else if (idx === 2) { - this.getCallTree({ - checks: [ - row[0].querySelector('lit-check-box')!.checked, - row[1].querySelector('lit-check-box')!.checked, - ev.target.checked, - row[3].querySelector('lit-check-box')!.checked, - row[4].querySelector('lit-check-box')!.checked, - ], - value: idx, - }); - } else if (idx === 3) { - this.getCallTree({ - checks: [ - row[0].querySelector('lit-check-box')!.checked, - row[1].querySelector('lit-check-box')!.checked, - row[2].querySelector('lit-check-box')!.checked, - ev.target.checked, - row[4].querySelector('lit-check-box')!.checked, - ], - value: idx, - }); - } else if (idx === 4) { - this.getCallTree({ - checks: [ - row[0].querySelector('lit-check-box')!.checked, - row[1].querySelector('lit-check-box')!.checked, - row[2].querySelector('lit-check-box')!.checked, - row[3].querySelector('lit-check-box')!.checked, - ev.target.checked, - ], - value: idx, - }); - } + this.treeCheckClickSwitch(idx, ev.target.checked, row); } }; }); @@ -809,312 +730,6 @@ export class TabPaneFilter extends BaseElement { } initHtml(): string { - return ` - - - Input Filter - - -
- -
- -
-
Invert
-
Hide System so
-
Hide Event
-
Hide Thread
-
Hide Thread State
-
- Options -
- -
- Options -
- -
- - - -
-
Constraints:Only enabled with data and while stopped;
-
filters data to thresholds.
-
- -
-
- Sample Count Filter -
- -
-
- -
-
-
Reset
-
-
- Symbol Filter -
- -
- -
- Transfer -
- -
-
- -
-
-
Reset
-
-
- Library Filter -
-
- -
Statistics by Thread
-
- `; + return TabPaneFilterHtml(this.inputPlaceholder); } } diff --git a/ide/test/trace/database/data-trafic/ThreadDataReceiver.test.ts b/ide/src/trace/component/trace/sheet/TabPaneJsMemoryFilter.html.ts similarity index 31% rename from ide/test/trace/database/data-trafic/ThreadDataReceiver.test.ts rename to ide/src/trace/component/trace/sheet/TabPaneJsMemoryFilter.html.ts index 9a579433..fe9ac166 100644 --- a/ide/test/trace/database/data-trafic/ThreadDataReceiver.test.ts +++ b/ide/src/trace/component/trace/sheet/TabPaneJsMemoryFilter.html.ts @@ -13,59 +13,56 @@ * limitations under the License. */ -import { threadDataReceiver } from "../../../../src/trace/database/data-trafic/ThreadDataReceiver"; - -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); - -describe('ThreadDataReceiver Test', () => { - let data = { - action: "exec-proto", - id: "258", - name: 30, - params: - { - endNS: 29372913537, - pid: 1668, - recordEndNS: 262379203084, - recordStartNS: 233006289547, - sharedArrayBuffers: undefined, - startNS: 0, - t: 1703581047560, - trafic: 2, - width: 1407 - } - } - - let threadData = [ - { - argSetId: -1, - cpu: null, - dur: 2327000, - id: 16, - pid: 590, - px: 285, - startTime: 2029133000, - state: "D", - tid: 590 - }, - { - argSetId: -1, - cpu: 3, - dur: 14494000, - id: 6, - pid: 1668, - px: 1331, - startTime: 9464658000, - state: "Running", - tid: 1699 - } - ] - it('ThreadDataReceiverTest01', async () => { - (self as unknown as Worker).postMessage = jest.fn(() => true); - expect(threadDataReceiver(data, () => { - return threadData; - })).toBeUndefined(); - }); -}); \ No newline at end of file +export const TabPaneJsMemoryFilterHtml = ` + +
+ Class Filter + +
+
+ +
+`; diff --git a/ide/src/trace/component/trace/sheet/TabPaneJsMemoryFilter.ts b/ide/src/trace/component/trace/sheet/TabPaneJsMemoryFilter.ts index b0bb5ccf..6af0f2fd 100644 --- a/ide/src/trace/component/trace/sheet/TabPaneJsMemoryFilter.ts +++ b/ide/src/trace/component/trace/sheet/TabPaneJsMemoryFilter.ts @@ -14,68 +14,16 @@ */ import { BaseElement, element } from '../../../../base-ui/BaseElement'; import '../../../../base-ui/icon/LitIcon'; -import { LitIcon } from '../../../../base-ui/icon/LitIcon'; import '../../../../base-ui/popover/LitPopoverV'; -import { LitCheckBox } from '../../../../base-ui/checkbox/LitCheckBox'; -import { LitSelect } from '../../../../base-ui/select/LitSelect'; import '../../../../base-ui/select/LitSelect'; -import { LitSelectOption } from '../../../../base-ui/select/LitSelectOption'; +import { TabPaneJsMemoryFilterHtml } from './TabPaneJsMemoryFilter.html'; + @element('tab-pane-js-memory-filter') export class TabPaneJsMemoryFilter extends BaseElement { - initElements(): void {} + initElements(): void { + } + initHtml(): string { - return ` - -
- Class Filter - -
-
- -
- `; + return TabPaneJsMemoryFilterHtml; } } diff --git a/ide/src/trace/component/trace/sheet/file-system/TabPaneFilesystemStatisticsAnalysis.ts b/ide/src/trace/component/trace/sheet/file-system/TabPaneFilesystemStatisticsAnalysis.ts index 66df5e4a..73ea220f 100644 --- a/ide/src/trace/component/trace/sheet/file-system/TabPaneFilesystemStatisticsAnalysis.ts +++ b/ide/src/trace/component/trace/sheet/file-system/TabPaneFilesystemStatisticsAnalysis.ts @@ -97,7 +97,7 @@ export class TabPaneFilesystemStatisticsAnalysis extends BaseElement { }, { funcName: 'getCurrentDataFromDb', - funcArgs: [{ queryFuncName: 'fileSystem', ...val }], + funcArgs: [{queryFuncName: 'fileSystem', ...val}], }, ], (results: any[]) => { @@ -105,6 +105,7 @@ export class TabPaneFilesystemStatisticsAnalysis extends BaseElement { } ); } + initElements(): void { this.fileStatisticsAnalysisRange = this.shadowRoot?.querySelector('#time-range'); this.fsPieChart = this.shadowRoot!.querySelector('#fs-chart-pie'); @@ -508,9 +509,36 @@ export class TabPaneFilesystemStatisticsAnalysis extends BaseElement { this.fileSystemTitleEl!.textContent = title; this.fsPieChart?.hideTip(); } + private libraryPieChart(): void { // @ts-ignore this.sumDur = this.libStatisticsData.allDuration; + this.setFsPieChartConfig(); + let fileSystemTitle = ''; + if (this.fsProcessName.length > 0) { + fileSystemTitle += this.fsProcessName + ' / '; + } + if (this.typeName.length > 0) { + if (this.hideThreadCheckBox?.checked) { + fileSystemTitle += this.typeName; + } else { + fileSystemTitle += this.typeName + ' / '; + } + } + if (this.fileStatisticsAnalysisThreadName.length > 0) { + fileSystemTitle += this.fileStatisticsAnalysisThreadName; + } + this.fileSystemTitleEl!.textContent = fileSystemTitle; + this.tabName!.textContent = 'Statistic By Library AllDuration'; + this.fileStatisticsAnalysisSoData.unshift(this.libStatisticsData); + this.fileStatisticsAnalysisTableSo!.recycleDataSource = this.fileStatisticsAnalysisSoData; + // @ts-ignore + this.fileStatisticsAnalysisSoData.shift(this.libStatisticsData); + this.currentLevelData = this.fileStatisticsAnalysisSoData; + this.fileStatisticsAnalysisTableSo?.reMeauseHeight(); + } + + private setFsPieChartConfig(): void { this.fsPieChart!.config = { appendPadding: 0, data: this.getFsPieChartData(this.fileStatisticsAnalysisSoData), @@ -547,33 +575,21 @@ export class TabPaneFilesystemStatisticsAnalysis extends BaseElement { }, ], }; - let fileSystemTitle = ''; - if (this.fsProcessName.length > 0) { - fileSystemTitle += this.fsProcessName + ' / '; - } - if (this.typeName.length > 0) { - if (this.hideThreadCheckBox?.checked) { - fileSystemTitle += this.typeName; - } else { - fileSystemTitle += this.typeName + ' / '; - } - } - if (this.fileStatisticsAnalysisThreadName.length > 0) { - fileSystemTitle += this.fileStatisticsAnalysisThreadName; - } - this.fileSystemTitleEl!.textContent = fileSystemTitle; - this.tabName!.textContent = 'Statistic By Library AllDuration'; - this.fileStatisticsAnalysisSoData.unshift(this.libStatisticsData); - this.fileStatisticsAnalysisTableSo!.recycleDataSource = this.fileStatisticsAnalysisSoData; - // @ts-ignore - this.fileStatisticsAnalysisSoData.shift(this.libStatisticsData); - this.currentLevelData = this.fileStatisticsAnalysisSoData; - this.fileStatisticsAnalysisTableSo?.reMeauseHeight(); } private fileSoLevelClickEvent(it: any): void { this.reset(this.fileStatisticsAnalysisTableFunction!, true); - this.getFilesystemFunction(it); + // this.getFilesystemFunction(it); + this.fileStatisticsAnalysisProgressEL!.loading = true; + this.shadowRoot!.querySelector('.fs-subheading')!.textContent = 'Statistic By Function AllDuration'; + if (!this.fileStatisticsAnalysisProcessData || this.fileStatisticsAnalysisProcessData.length === 0) { + return; + } + let allDur = 0; + let symbolMap = new Map>(); + allDur = this.symbolMapProcessData(it, allDur, symbolMap); + this.updateFunctionData(symbolMap, it, allDur); + this.getFilesystemFunction(allDur); let title = ''; if (this.fsProcessName.length > 0) { title += this.fsProcessName + ' / '; @@ -591,6 +607,51 @@ export class TabPaneFilesystemStatisticsAnalysis extends BaseElement { this.fsPieChart?.hideTip(); } + private getFilesystemFunction(allDur: number): void { + this.fileStatisticsAnalysisFunctionData.sort((a, b) => b.duration - a.duration); + this.functionStatisticsData = this.totalDurationData(allDur); + this.currentLevel = 4; + this.fileStatisticsAnalysisProgressEL!.loading = false; + // @ts-ignore + this.sumDur = this.functionStatisticsData.allDuration; + this.fsPieChart!.config = { + appendPadding: 0, + data: this.getFsPieChartData(this.fileStatisticsAnalysisFunctionData), + angleField: 'duration', + colorField: 'tableName', + radius: 1, + label: { + type: 'outer', + }, + tip: (fsaObj): string => { + return `
+
Function:${fsaObj.obj.tableName}
+
Duration:${fsaObj.obj.durFormat}
+
percent:${fsaObj.obj.percent}
+
+ `; + }, + hoverHandler: (data): void => { + if (data) { + this.fileStatisticsAnalysisTableFunction!.setCurrentHover(data); + } else { + this.fileStatisticsAnalysisTableFunction!.mouseOut(); + } + }, + interactions: [ + { + type: 'element-active', + }, + ], + }; + this.fileStatisticsAnalysisFunctionData.unshift(this.functionStatisticsData); + this.fileStatisticsAnalysisTableFunction!.recycleDataSource = this.fileStatisticsAnalysisFunctionData; + this.fileStatisticsAnalysisTableFunction?.reMeauseHeight(); + // @ts-ignore + this.fileStatisticsAnalysisFunctionData.shift(this.functionStatisticsData); + this.currentLevelData = this.fileStatisticsAnalysisFunctionData; + } + private sortByColumn(): void { let fsaCurrentTable: LitTable | null | undefined; switch (this.currentLevel) { @@ -614,71 +675,83 @@ export class TabPaneFilesystemStatisticsAnalysis extends BaseElement { return; } if (this.fsSortType === 0) { - let fsaArr = [...this.currentLevelData]; - switch (this.currentLevel) { - case 0: - fsaArr.unshift(this.processStatisticsData); - break; - case 1: - fsaArr.unshift(this.typeStatisticsData); - break; - case 2: - fsaArr.unshift(this.threadStatisticsData); - break; - case 3: - fsaArr.unshift(this.libStatisticsData); - break; - case 4: - fsaArr.unshift(this.functionStatisticsData); - break; - } - fsaCurrentTable!.recycleDataSource = fsaArr; + this.sortAndRefreshTable(fsaCurrentTable); } else { - let fsaArray = [...this.currentLevelData]; - if (this.fsSortColumn === 'tableName') { - fsaCurrentTable!.recycleDataSource = fsaArray.sort((firstElement, secondElement) => { - if (this.fsSortType === 1) { - if (firstElement.tableName > secondElement.tableName) { - return 1; - } else if (firstElement.tableName === secondElement.tableName) { - return 0; - } else { - return -1; - } - } else { - if (secondElement.tableName > firstElement.tableName) { - return 1; - } else if (firstElement.tableName === secondElement.tableName) { - return 0; - } else { - return -1; - } - } - }); - } else if (this.fsSortColumn === 'durFormat' || this.fsSortColumn === 'percent') { - fsaCurrentTable!.recycleDataSource = fsaArray.sort((a, b) => { - return this.fsSortType === 1 ? a.duration - b.duration : b.duration - a.duration; - }); - } - switch (this.currentLevel) { - case 0: - fsaArray.unshift(this.processStatisticsData); - break; - case 1: - fsaArray.unshift(this.typeStatisticsData); - break; - case 2: - fsaArray.unshift(this.threadStatisticsData); - break; - case 3: - fsaArray.unshift(this.libStatisticsData); - break; - case 4: - fsaArray.unshift(this.functionStatisticsData); - break; - } - fsaCurrentTable!.recycleDataSource = fsaArray; + this.sortAndRefreshTableByColumn(fsaCurrentTable); + } + } + + private sortAndRefreshTableByColumn(fsaCurrentTable: LitTable): void { + let fsaArray = [...this.currentLevelData]; + if (this.fsSortColumn === 'tableName') { + this.sortTableNameCase(fsaCurrentTable, fsaArray); + } else if (this.fsSortColumn === 'durFormat' || this.fsSortColumn === 'percent') { + fsaCurrentTable!.recycleDataSource = fsaArray.sort((a, b) => { + return this.fsSortType === 1 ? a.duration - b.duration : b.duration - a.duration; + }); } + switch (this.currentLevel) { + case 0: + fsaArray.unshift(this.processStatisticsData); + break; + case 1: + fsaArray.unshift(this.typeStatisticsData); + break; + case 2: + fsaArray.unshift(this.threadStatisticsData); + break; + case 3: + fsaArray.unshift(this.libStatisticsData); + break; + case 4: + fsaArray.unshift(this.functionStatisticsData); + break; + } + fsaCurrentTable!.recycleDataSource = fsaArray; + } + + private sortAndRefreshTable(fsaCurrentTable: LitTable): void { + let fsaArr = [...this.currentLevelData]; + switch (this.currentLevel) { + case 0: + fsaArr.unshift(this.processStatisticsData); + break; + case 1: + fsaArr.unshift(this.typeStatisticsData); + break; + case 2: + fsaArr.unshift(this.threadStatisticsData); + break; + case 3: + fsaArr.unshift(this.libStatisticsData); + break; + case 4: + fsaArr.unshift(this.functionStatisticsData); + break; + } + fsaCurrentTable!.recycleDataSource = fsaArr; + } + + private sortTableNameCase(fsaCurrentTable: LitTable, fsaArray: any[]) { + fsaCurrentTable!.recycleDataSource = fsaArray.sort((firstElement, secondElement) => { + if (this.fsSortType === 1) { + if (firstElement.tableName > secondElement.tableName) { + return 1; + } else if (firstElement.tableName === secondElement.tableName) { + return 0; + } else { + return -1; + } + } else { + if (secondElement.tableName > firstElement.tableName) { + return 1; + } else if (firstElement.tableName === secondElement.tableName) { + return 0; + } else { + return -1; + } + } + }); } private getFilesystemProcess(result: Array): void { @@ -800,6 +873,15 @@ export class TabPaneFilesystemStatisticsAnalysis extends BaseElement { threadMap.set(fspItem.tid, itemArray); } } + this.updateThreadData(threadMap, fileSysStatThreadItem, allDur); + this.fileStatisticsAnalysisThreadData.sort((a, b) => b.duration - a.duration); + this.threadStatisticsData = this.totalDurationData(allDur); + this.currentLevel = 2; + this.fileStatisticsAnalysisProgressEL!.loading = false; + this.threadPieChart(); + } + + private updateThreadData(threadMap: Map>, fileSysStatThreadItem: any, allDur: number): void { this.fileStatisticsAnalysisThreadData = []; threadMap.forEach((value: Array, key: string) => { let dur = 0; @@ -822,11 +904,6 @@ export class TabPaneFilesystemStatisticsAnalysis extends BaseElement { }; this.fileStatisticsAnalysisThreadData.push(threadData); }); - this.fileStatisticsAnalysisThreadData.sort((a, b) => b.duration - a.duration); - this.threadStatisticsData = this.totalDurationData(allDur); - this.currentLevel = 2; - this.fileStatisticsAnalysisProgressEL!.loading = false; - this.threadPieChart(); } private getFilesystemSo(item: any): void { @@ -836,23 +913,18 @@ export class TabPaneFilesystemStatisticsAnalysis extends BaseElement { if (!this.fileStatisticsAnalysisProcessData || this.fileStatisticsAnalysisProcessData.length === 0) { return; } + allDur = this.libMapProcessData(item, allDur, libMap); + this.updateSoData(libMap, item, allDur); + this.libStatisticsData = this.totalDurationData(allDur); + this.currentLevel = 3; + this.fileStatisticsAnalysisProgressEL!.loading = false; + this.libraryPieChart(); + } + + private libMapProcessData(item: any, allDur: number, libMap: Map>): number { for (let itemData of this.fileStatisticsAnalysisProcessData) { - if (!this.hideProcessCheckBox?.checked && !this.hideThreadCheckBox?.checked) { - if (item && (itemData.pid !== item.pid || itemData.tid !== item.tid || itemData.type !== item.type)) { - continue; - } - } else if (!this.hideProcessCheckBox?.checked && this.hideThreadCheckBox?.checked) { - if (item && (itemData.pid !== item.pid || itemData.type !== item.type)) { - continue; - } - } else if (this.hideProcessCheckBox?.checked && !this.hideThreadCheckBox?.checked) { - if ((item && itemData.tid !== item.tid) || itemData.type !== item.type) { - continue; - } - } else if (this.hideProcessCheckBox?.checked && this.hideThreadCheckBox?.checked) { - if (item && itemData.type !== item.type) { - continue; - } + if (this.libIsAccumulationData(item, itemData)) { + continue; } allDur += itemData.dur; if (libMap.has(itemData.libId)) { @@ -863,6 +935,29 @@ export class TabPaneFilesystemStatisticsAnalysis extends BaseElement { libMap.set(itemData.libId, dataArray); } } + return allDur; + } + + private libIsAccumulationData(item: any, itemData: any): boolean { + if (!item) { + return false; + } + if (!this.hideProcessCheckBox?.checked && !this.hideThreadCheckBox?.checked) { + return (itemData.pid !== item.pid || itemData.tid !== item.tid || itemData.type !== item.type); + } + if (!this.hideProcessCheckBox?.checked && this.hideThreadCheckBox?.checked) { + return (itemData.pid !== item.pid || itemData.type !== item.type); + } + if (this.hideProcessCheckBox?.checked && !this.hideThreadCheckBox?.checked) { + return (itemData.tid !== item.tid || itemData.type !== item.type); + } + if (this.hideProcessCheckBox?.checked && this.hideThreadCheckBox?.checked) { + return (itemData.type !== item.type); + } + return false; + } + + private updateSoData(libMap: Map>, item: any, allDur: number): void { this.fileStatisticsAnalysisSoData = []; libMap.forEach((value: any[], key: number) => { let dur = 0; @@ -891,46 +986,16 @@ export class TabPaneFilesystemStatisticsAnalysis extends BaseElement { this.fileStatisticsAnalysisSoData.push(soData); }); this.fileStatisticsAnalysisSoData.sort((a, b) => b.duration - a.duration); - this.libStatisticsData = this.totalDurationData(allDur); - this.currentLevel = 3; - this.fileStatisticsAnalysisProgressEL!.loading = false; - this.libraryPieChart(); } - private getFilesystemFunction(item: any): void { - this.fileStatisticsAnalysisProgressEL!.loading = true; - this.shadowRoot!.querySelector('.fs-subheading')!.textContent = 'Statistic By Function AllDuration'; + private symbolMapProcessData(item: any, allDur: number, symbolMap: Map>): number { let tid = item.tid; let pid = item.pid; let type = item.type; let libId = item.libId; - let allDur = 0; - let symbolMap = new Map>(); - if (!this.fileStatisticsAnalysisProcessData || this.fileStatisticsAnalysisProcessData.length === 0) { - return; - } for (let fsProcessData of this.fileStatisticsAnalysisProcessData) { - if (!this.hideProcessCheckBox?.checked && !this.hideThreadCheckBox?.checked) { - if ( - fsProcessData.pid !== pid || - fsProcessData.tid !== tid || - fsProcessData.type !== type || - fsProcessData.libId !== libId - ) { - continue; - } - } else if (!this.hideProcessCheckBox?.checked && this.hideThreadCheckBox?.checked) { - if (fsProcessData.pid !== pid || fsProcessData.type !== type || fsProcessData.libId !== libId) { - continue; - } - } else if (this.hideProcessCheckBox?.checked && !this.hideThreadCheckBox?.checked) { - if (fsProcessData.tid !== tid || fsProcessData.type !== type || fsProcessData.libId !== libId) { - continue; - } - } else if (this.hideProcessCheckBox?.checked && this.hideThreadCheckBox?.checked) { - if (fsProcessData.type !== type || fsProcessData.libId !== libId) { - continue; - } + if (this.symbolIsAccumulationData(fsProcessData, tid, pid, type, libId)) { + continue; } allDur += fsProcessData.dur; if (symbolMap.has(fsProcessData.symbolId)) { @@ -941,6 +1006,29 @@ export class TabPaneFilesystemStatisticsAnalysis extends BaseElement { symbolMap.set(fsProcessData.symbolId, dataArray); } } + return allDur; + } + + private symbolIsAccumulationData(fsProcessData: any, tid: number, pid: number, type: string, libId: number): boolean { + if (!fsProcessData) { + return false; + } + if (!this.hideProcessCheckBox?.checked && !this.hideThreadCheckBox?.checked) { + return (fsProcessData.pid !== pid || fsProcessData.tid !== tid || fsProcessData.type !== type || fsProcessData.libId !== libId); + } + if (!this.hideProcessCheckBox?.checked && this.hideThreadCheckBox?.checked) { + return (fsProcessData.pid !== pid || fsProcessData.type !== type || fsProcessData.libId !== libId); + } + if (this.hideProcessCheckBox?.checked && !this.hideThreadCheckBox?.checked) { + return (fsProcessData.tid !== tid || fsProcessData.type !== type || fsProcessData.libId !== libId); + } + if (this.hideProcessCheckBox?.checked && this.hideThreadCheckBox?.checked) { + return (fsProcessData.type !== type || fsProcessData.libId !== libId); + } + return false; + } + + private updateFunctionData(symbolMap: Map>, item: any, allDur: number): void { this.fileStatisticsAnalysisFunctionData = []; symbolMap.forEach((symbolItems, key) => { let dur = 0; @@ -966,48 +1054,6 @@ export class TabPaneFilesystemStatisticsAnalysis extends BaseElement { }; this.fileStatisticsAnalysisFunctionData.push(symbolData); }); - this.fileStatisticsAnalysisFunctionData.sort((a, b) => b.duration - a.duration); - this.functionStatisticsData = this.totalDurationData(allDur); - this.currentLevel = 4; - this.fileStatisticsAnalysisProgressEL!.loading = false; - // @ts-ignore - this.sumDur = this.functionStatisticsData.allDuration; - this.fsPieChart!.config = { - appendPadding: 0, - data: this.getFsPieChartData(this.fileStatisticsAnalysisFunctionData), - angleField: 'duration', - colorField: 'tableName', - radius: 1, - label: { - type: 'outer', - }, - tip: (fsaObj): string => { - return `
-
Function:${fsaObj.obj.tableName}
-
Duration:${fsaObj.obj.durFormat}
-
percent:${fsaObj.obj.percent}
-
- `; - }, - hoverHandler: (data): void => { - if (data) { - this.fileStatisticsAnalysisTableFunction!.setCurrentHover(data); - } else { - this.fileStatisticsAnalysisTableFunction!.mouseOut(); - } - }, - interactions: [ - { - type: 'element-active', - }, - ], - }; - this.fileStatisticsAnalysisFunctionData.unshift(this.functionStatisticsData); - this.fileStatisticsAnalysisTableFunction!.recycleDataSource = this.fileStatisticsAnalysisFunctionData; - this.fileStatisticsAnalysisTableFunction?.reMeauseHeight(); - // @ts-ignore - this.fileStatisticsAnalysisFunctionData.shift(this.functionStatisticsData); - this.currentLevelData = this.fileStatisticsAnalysisFunctionData; } private typeIdToString(transformType: number): string { @@ -1067,7 +1113,7 @@ export class TabPaneFilesystemStatisticsAnalysis extends BaseElement { procedurePool.submitWithName( 'logic0', 'fileSystem-action', - { args, callType: 'fileSystem', isAnalysis: true }, + {args, callType: 'fileSystem', isAnalysis: true}, undefined, (results: any) => { handler(results); diff --git a/ide/src/trace/component/trace/sheet/file-system/TabPaneIOTierStatisticsAnalysis.ts b/ide/src/trace/component/trace/sheet/file-system/TabPaneIOTierStatisticsAnalysis.ts index 16015aa5..e09a35f4 100644 --- a/ide/src/trace/component/trace/sheet/file-system/TabPaneIOTierStatisticsAnalysis.ts +++ b/ide/src/trace/component/trace/sheet/file-system/TabPaneIOTierStatisticsAnalysis.ts @@ -100,7 +100,7 @@ export class TabPaneIOTierStatisticsAnalysis extends BaseElement { }, { funcName: 'getCurrentDataFromDb', - funcArgs: [{ queryFuncName: 'io', ...ioTierStatisticsAnalysisSelection }], + funcArgs: [{queryFuncName: 'io', ...ioTierStatisticsAnalysisSelection}], }, ], (results: any[]) => { @@ -109,6 +109,7 @@ export class TabPaneIOTierStatisticsAnalysis extends BaseElement { } ); } + initElements(): void { this.range = this.shadowRoot?.querySelector('#time-range'); this.ioPieChart = this.shadowRoot!.querySelector('#io-tier-chart-pie'); @@ -200,13 +201,13 @@ export class TabPaneIOTierStatisticsAnalysis extends BaseElement { detail.data.tid = undefined; } ioTab!.rowClickData = detail.data; - let title = ''; + let ioTitle = ''; if (this.tierTitleEl?.textContent === '') { - title = detail.data.tableName; + ioTitle = detail.data.tableName; } else { - title = this.tierTitleEl?.textContent + ' / ' + detail.data.tableName; + ioTitle = this.tierTitleEl?.textContent + ' / ' + detail.data.tableName; } - ioTab!.pieTitle = title; + ioTab!.pieTitle = ioTitle; // 是否是在表格上右键点击跳转到火焰图的 this.currentSelection!.isRowClick = true; ioTab!.data = this.currentSelection; @@ -545,6 +546,17 @@ export class TabPaneIOTierStatisticsAnalysis extends BaseElement { }, ], }; + this.ioTierTitle(); + this.tabName!.textContent = 'Statistic By Library AllDuration'; + this.soData.unshift(this.libStatisticsData); + this.ioTierTableSo!.recycleDataSource = this.soData; + // @ts-ignore + this.soData.shift(this.libStatisticsData); + this.currentLevelData = this.soData; + this.ioTierTableSo?.reMeauseHeight(); + } + + private ioTierTitle(): void { let title = ''; if (this.processName.length > 0) { title += this.processName + ' / '; @@ -560,13 +572,6 @@ export class TabPaneIOTierStatisticsAnalysis extends BaseElement { title += this.threadName; } this.tierTitleEl!.textContent = title; - this.tabName!.textContent = 'Statistic By Library AllDuration'; - this.soData.unshift(this.libStatisticsData); - this.ioTierTableSo!.recycleDataSource = this.soData; - // @ts-ignore - this.soData.shift(this.libStatisticsData); - this.currentLevelData = this.soData; - this.ioTierTableSo?.reMeauseHeight(); } private ioTierSoLevelClickEvent(it: any): void { @@ -611,6 +616,10 @@ export class TabPaneIOTierStatisticsAnalysis extends BaseElement { if (!ioTierCurrentTable) { return; } + this.sortByType(ioTierCurrentTable); + } + + private sortByType(ioTierCurrentTable: LitTable): void { if (this.ioSortType === 0) { let sortZeroIoArr = [...this.currentLevelData]; switch (this.currentLevel) { @@ -634,25 +643,7 @@ export class TabPaneIOTierStatisticsAnalysis extends BaseElement { } else { let sortIoArr = [...this.currentLevelData]; if (this.ioSortColumn === 'tableName') { - ioTierCurrentTable!.recycleDataSource = sortIoArr.sort((firstIOElement, secondIOElement) => { - if (this.ioSortType === 1) { - if (firstIOElement.tableName > secondIOElement.tableName) { - return 1; - } else if (firstIOElement.tableName === secondIOElement.tableName) { - return 0; - } else { - return -1; - } - } else { - if (secondIOElement.tableName > firstIOElement.tableName) { - return 1; - } else if (firstIOElement.tableName === secondIOElement.tableName) { - return 0; - } else { - return -1; - } - } - }); + this.sortTableNameCase(ioTierCurrentTable, sortIoArr); } else if (this.ioSortColumn === 'durFormat' || this.ioSortColumn === 'percent') { ioTierCurrentTable!.recycleDataSource = sortIoArr.sort((a, b) => { return this.ioSortType === 1 ? a.duration - b.duration : b.duration - a.duration; @@ -679,6 +670,28 @@ export class TabPaneIOTierStatisticsAnalysis extends BaseElement { } } + private sortTableNameCase(ioTierCurrentTable: LitTable, sortIoArr: any[]): void { + ioTierCurrentTable!.recycleDataSource = sortIoArr.sort((firstIOElement, secondIOElement) => { + if (this.ioSortType === 1) { + if (firstIOElement.tableName > secondIOElement.tableName) { + return 1; + } else if (firstIOElement.tableName === secondIOElement.tableName) { + return 0; + } else { + return -1; + } + } else { + if (secondIOElement.tableName > firstIOElement.tableName) { + return 1; + } else if (firstIOElement.tableName === secondIOElement.tableName) { + return 0; + } else { + return -1; + } + } + }); + } + private getIOTierProcess(result: Array): void { if (!this.processData || this.processData.length === 0) { this.pidData = []; @@ -798,6 +811,15 @@ export class TabPaneIOTierStatisticsAnalysis extends BaseElement { threadMap.set(itemData.tid, itemArray); } } + this.calculateThreadData(threadMap, item, allDur); + this.threadData.sort((a, b) => b.duration - a.duration); + this.threadStatisticsData = this.totalDurationData(allDur); + this.currentLevel = 2; + this.progressEL!.loading = false; + this.threadPieChart(); + } + + private calculateThreadData(threadMap: Map>, item: any, allDur: number): void { this.threadData = []; threadMap.forEach((value: Array, key: string) => { let dur = 0; @@ -818,11 +840,6 @@ export class TabPaneIOTierStatisticsAnalysis extends BaseElement { }; this.threadData.push(threadData); }); - this.threadData.sort((a, b) => b.duration - a.duration); - this.threadStatisticsData = this.totalDurationData(allDur); - this.currentLevel = 2; - this.progressEL!.loading = false; - this.threadPieChart(); } private getIOTierSo(item: any): void { @@ -833,25 +850,8 @@ export class TabPaneIOTierStatisticsAnalysis extends BaseElement { return; } for (let processItemData of this.processData) { - if (!this.hideProcessCheckBox?.checked && !this.hideThreadCheckBox?.checked) { - if ( - item && - (processItemData.pid !== item.pid || processItemData.tid !== item.tid || processItemData.type !== item.type) - ) { - continue; - } - } else if (!this.hideProcessCheckBox?.checked && this.hideThreadCheckBox?.checked) { - if (item && (processItemData.pid !== item.pid || processItemData.type !== item.type)) { - continue; - } - } else if (this.hideProcessCheckBox?.checked && !this.hideThreadCheckBox?.checked) { - if ((item && processItemData.tid !== item.tid) || processItemData.type !== item.type) { - continue; - } - } else if (this.hideProcessCheckBox?.checked && this.hideThreadCheckBox?.checked) { - if (item && processItemData.type !== item.type) { - continue; - } + if (this.tierSoIsAccumulationData(item, processItemData)) { + continue; } allDur += processItemData.dur; if (libMap.has(processItemData.libId)) { @@ -862,6 +862,28 @@ export class TabPaneIOTierStatisticsAnalysis extends BaseElement { libMap.set(processItemData.libId, dataArray); } } + this.updateSoData(libMap, item, allDur); + this.libStatisticsData = this.totalDurationData(allDur); + this.currentLevel = 3; + this.progressEL!.loading = false; + this.libraryPieChart(); + } + + private tierSoIsAccumulationData(item: any, processItemData: any): boolean { + if (!this.hideProcessCheckBox?.checked && !this.hideThreadCheckBox?.checked) { + return item && + (processItemData.pid !== item.pid || processItemData.tid !== item.tid || processItemData.type !== item.type); + } else if (!this.hideProcessCheckBox?.checked && this.hideThreadCheckBox?.checked) { + return item && (processItemData.pid !== item.pid || processItemData.type !== item.type); + } else if (this.hideProcessCheckBox?.checked && !this.hideThreadCheckBox?.checked) { + return (item && processItemData.tid !== item.tid) || processItemData.type !== item.type; + } else if (this.hideProcessCheckBox?.checked && this.hideThreadCheckBox?.checked) { + return item && processItemData.type !== item.type; + } + return false; + } + + private updateSoData(libMap: Map>, item: any, allDur: number): void { this.soData = []; libMap.forEach((value: any[], key: number) => { let dur = 0; @@ -890,10 +912,6 @@ export class TabPaneIOTierStatisticsAnalysis extends BaseElement { this.soData.push(soData); }); this.soData.sort((a, b) => b.duration - a.duration); - this.libStatisticsData = this.totalDurationData(allDur); - this.currentLevel = 3; - this.progressEL!.loading = false; - this.libraryPieChart(); } private getIOTierFunction(item: any): void { @@ -910,27 +928,8 @@ export class TabPaneIOTierStatisticsAnalysis extends BaseElement { return; } for (let processData of this.processData) { - if (!this.hideProcessCheckBox?.checked && !this.hideThreadCheckBox?.checked) { - if ( - processData.pid !== pid || - processData.tid !== tid || - processData.type !== type || - processData.libId !== libId - ) { - continue; - } - } else if (!this.hideProcessCheckBox?.checked && this.hideThreadCheckBox?.checked) { - if (processData.pid !== pid || processData.type !== type || processData.libId !== libId) { - continue; - } - } else if (this.hideProcessCheckBox?.checked && !this.hideThreadCheckBox?.checked) { - if (processData.tid !== tid || processData.type !== type || processData.libId !== libId) { - continue; - } - } else if (this.hideProcessCheckBox?.checked && this.hideThreadCheckBox?.checked) { - if (processData.type !== type || processData.libId !== libId) { - continue; - } + if (this.functionIsAccumulationData(processData, tid, pid, type, libId)) { + continue; } allDur += processData.dur; if (symbolMap.has(processData.symbolId)) { @@ -941,37 +940,22 @@ export class TabPaneIOTierStatisticsAnalysis extends BaseElement { symbolMap.set(processData.symbolId, dataArray); } } - this.functionData = []; - symbolMap.forEach((symbolItems, key) => { - let dur = 0; - let funSymbolName = ''; - for (let symbolItem of symbolItems) { - funSymbolName = symbolItem.symbolName; - dur += symbolItem.dur; - } - let symbolPath = funSymbolName?.split('/'); - if (symbolPath) { - funSymbolName = symbolPath[symbolPath.length - 1]; - } - const symbolData = { - pid: item.pid, - tid: item.tid, - type: item.type, - libId: item.libId, - symbolId: key, - percent: ((dur / allDur) * 100).toFixed(2), - tableName: funSymbolName, - durFormat: Utils.getProbablyTime(dur), - duration: dur, - }; - this.functionData.push(symbolData); - }); - this.functionData.sort((a, b) => b.duration - a.duration); + this.updateFunctionData(symbolMap, item, allDur); this.functionStatisticsData = this.totalDurationData(allDur); this.currentLevel = 4; this.progressEL!.loading = false; // @ts-ignore this.sumDur = this.functionStatisticsData.allDuration; + this.setIoPieChartConfig(); + this.functionData.unshift(this.functionStatisticsData); + this.tableFunction!.recycleDataSource = this.functionData; + this.tableFunction?.reMeauseHeight(); + // @ts-ignore + this.functionData.shift(this.functionStatisticsData); + this.currentLevelData = this.functionData; + } + + private setIoPieChartConfig(): void { this.ioPieChart!.config = { appendPadding: 0, data: this.getIOTierPieChartData(this.functionData), @@ -995,12 +979,52 @@ export class TabPaneIOTierStatisticsAnalysis extends BaseElement { }, ], }; - this.functionData.unshift(this.functionStatisticsData); - this.tableFunction!.recycleDataSource = this.functionData; - this.tableFunction?.reMeauseHeight(); - // @ts-ignore - this.functionData.shift(this.functionStatisticsData); - this.currentLevelData = this.functionData; + } + + private functionIsAccumulationData(processData: any, tid: number, pid: number, type: string, libId: number): boolean { + if (!processData) { + return false; + } + if (!this.hideProcessCheckBox?.checked && !this.hideThreadCheckBox?.checked) { + return processData.pid !== pid || processData.tid !== tid || + processData.type !== type || processData.libId !== libId; + } else if (!this.hideProcessCheckBox?.checked && this.hideThreadCheckBox?.checked) { + return processData.pid !== pid || processData.type !== type || processData.libId !== libId; + } else if (this.hideProcessCheckBox?.checked && !this.hideThreadCheckBox?.checked) { + return processData.tid !== tid || processData.type !== type || processData.libId !== libId; + } else if (this.hideProcessCheckBox?.checked && this.hideThreadCheckBox?.checked) { + return processData.type !== type || processData.libId !== libId; + } + return false; + } + + private updateFunctionData(symbolMap: Map>, item: any, allDur: number): void { + this.functionData = []; + symbolMap.forEach((symbolItems, key) => { + let dur = 0; + let funSymbolName = ''; + for (let symbolItem of symbolItems) { + funSymbolName = symbolItem.symbolName; + dur += symbolItem.dur; + } + let symbolPath = funSymbolName?.split('/'); + if (symbolPath) { + funSymbolName = symbolPath[symbolPath.length - 1]; + } + const symbolData = { + pid: item.pid, + tid: item.tid, + type: item.type, + libId: item.libId, + symbolId: key, + percent: ((dur / allDur) * 100).toFixed(2), + tableName: funSymbolName, + durFormat: Utils.getProbablyTime(dur), + duration: dur, + }; + this.functionData.push(symbolData); + }); + this.functionData.sort((a, b) => b.duration - a.duration); } private getTip() { @@ -1075,7 +1099,7 @@ export class TabPaneIOTierStatisticsAnalysis extends BaseElement { procedurePool.submitWithName( 'logic0', 'fileSystem-action', - { args, callType: 'io', isAnalysis: true }, + {args, callType: 'io', isAnalysis: true}, undefined, (results: any) => { handler(results); diff --git a/ide/src/trace/component/trace/sheet/file-system/TabPaneVirtualMemoryStatisticsAnalysis.ts b/ide/src/trace/component/trace/sheet/file-system/TabPaneVirtualMemoryStatisticsAnalysis.ts index 9945f22e..8614a060 100644 --- a/ide/src/trace/component/trace/sheet/file-system/TabPaneVirtualMemoryStatisticsAnalysis.ts +++ b/ide/src/trace/component/trace/sheet/file-system/TabPaneVirtualMemoryStatisticsAnalysis.ts @@ -100,7 +100,7 @@ export class TabPaneVirtualMemoryStatisticsAnalysis extends BaseElement { }, { funcName: 'getCurrentDataFromDb', - funcArgs: [{ queryFuncName: 'virtualMemory', ...vmStatisticsAnalysisSelection }], + funcArgs: [{queryFuncName: 'virtualMemory', ...vmStatisticsAnalysisSelection}], }, ], (results: any[]) => { @@ -503,6 +503,32 @@ export class TabPaneVirtualMemoryStatisticsAnalysis extends BaseElement { private libraryPieChart(): void { // @ts-ignore this.sumDur = this.libStatisticsData.allDuration; + this.setVmPieConfig(); + let title = ''; + if (this.vmProcessName.length > 0) { + title += this.vmProcessName + ' / '; + } + if (this.vmtypeName.length > 0) { + if (this.hideThreadCheckBox?.checked) { + title += this.vmtypeName; + } else { + title += this.vmtypeName + ' / '; + } + } + if (this.vmThreadName.length > 0) { + title += this.vmThreadName; + } + this.virtualMemoryTitleEl!.textContent = title; + this.tabName!.textContent = 'Statistic By Library AllDuration'; + this.vmStatisticsAnalysisSoData.unshift(this.libStatisticsData); + this.vmStatisticsAnalysisTableSo!.recycleDataSource = this.vmStatisticsAnalysisSoData; + // @ts-ignore + this.vmStatisticsAnalysisSoData.shift(this.libStatisticsData); + this.currentLevelData = this.vmStatisticsAnalysisSoData; + this.vmStatisticsAnalysisTableSo?.reMeauseHeight(); + } + + private setVmPieChartConfig(): void { this.vmPieChart!.config = { appendPadding: 0, data: this.getVmPieChartData(this.vmStatisticsAnalysisSoData), @@ -539,28 +565,6 @@ export class TabPaneVirtualMemoryStatisticsAnalysis extends BaseElement { }, ], }; - let title = ''; - if (this.vmProcessName.length > 0) { - title += this.vmProcessName + ' / '; - } - if (this.vmtypeName.length > 0) { - if (this.hideThreadCheckBox?.checked) { - title += this.vmtypeName; - } else { - title += this.vmtypeName + ' / '; - } - } - if (this.vmThreadName.length > 0) { - title += this.vmThreadName; - } - this.virtualMemoryTitleEl!.textContent = title; - this.tabName!.textContent = 'Statistic By Library AllDuration'; - this.vmStatisticsAnalysisSoData.unshift(this.libStatisticsData); - this.vmStatisticsAnalysisTableSo!.recycleDataSource = this.vmStatisticsAnalysisSoData; - // @ts-ignore - this.vmStatisticsAnalysisSoData.shift(this.libStatisticsData); - this.currentLevelData = this.vmStatisticsAnalysisSoData; - this.vmStatisticsAnalysisTableSo?.reMeauseHeight(); } private vmSoLevelClickEvent(it: any): void { @@ -605,6 +609,10 @@ export class TabPaneVirtualMemoryStatisticsAnalysis extends BaseElement { if (!vmsCurrentTable) { return; } + this.sortByType(vmsCurrentTable); + } + + private sortByType(vmsCurrentTable: LitTable): void { if (this.vmSortType === 0) { let vmsArr = [...this.currentLevelData]; switch (this.currentLevel) { @@ -628,25 +636,7 @@ export class TabPaneVirtualMemoryStatisticsAnalysis extends BaseElement { } else { let vmsArray = [...this.currentLevelData]; if (this.vmSortColumn === 'tableName') { - vmsCurrentTable!.recycleDataSource = vmsArray.sort((firstVMElement, secondVMElement) => { - if (this.vmSortType === 1) { - if (firstVMElement.tableName > secondVMElement.tableName) { - return 1; - } else if (firstVMElement.tableName === secondVMElement.tableName) { - return 0; - } else { - return -1; - } - } else { - if (secondVMElement.tableName > firstVMElement.tableName) { - return 1; - } else if (firstVMElement.tableName === secondVMElement.tableName) { - return 0; - } else { - return -1; - } - } - }); + this.sortTableNameCase(vmsCurrentTable, vmsArray); } else if (this.vmSortColumn === 'durFormat' || this.vmSortColumn === 'percent') { vmsCurrentTable!.recycleDataSource = vmsArray.sort((a, b) => { return this.vmSortType === 1 ? a.duration - b.duration : b.duration - a.duration; @@ -673,6 +663,28 @@ export class TabPaneVirtualMemoryStatisticsAnalysis extends BaseElement { } } + private sortTableNameCase(vmsCurrentTable: LitTable, vmsArray: any[]): void { + vmsCurrentTable!.recycleDataSource = vmsArray.sort((firstVMElement, secondVMElement) => { + if (this.vmSortType === 1) { + if (firstVMElement.tableName > secondVMElement.tableName) { + return 1; + } else if (firstVMElement.tableName === secondVMElement.tableName) { + return 0; + } else { + return -1; + } + } else { + if (secondVMElement.tableName > firstVMElement.tableName) { + return 1; + } else if (firstVMElement.tableName === secondVMElement.tableName) { + return 0; + } else { + return -1; + } + } + }); + } + private getVirtualMemoryProcess(result: Array): void { this.vmStatisticsAnalysisProgressEL!.loading = true; this.vmStatisticsAnalysisProcessData = JSON.parse(JSON.stringify(result)); @@ -793,6 +805,14 @@ export class TabPaneVirtualMemoryStatisticsAnalysis extends BaseElement { threadMap.set(vmapItem.tid, itemArray); } } + this.updateVmThreadData(threadMap, item, allDur); + this.threadStatisticsData = this.totalDurationData(allDur); + this.currentLevel = 2; + this.vmStatisticsAnalysisProgressEL!.loading = false; + this.threadPieChart(); + } + + private updateVmThreadData(threadMap: Map>, item: any, allDur: number): void { this.vmStatisticsAnalysisThreadData = []; threadMap.forEach((value: Array, key: string) => { let vmThreadDur = 0; @@ -814,10 +834,6 @@ export class TabPaneVirtualMemoryStatisticsAnalysis extends BaseElement { this.vmStatisticsAnalysisThreadData.push(threadData); }); this.vmStatisticsAnalysisThreadData.sort((a, b) => b.duration - a.duration); - this.threadStatisticsData = this.totalDurationData(allDur); - this.currentLevel = 2; - this.vmStatisticsAnalysisProgressEL!.loading = false; - this.threadPieChart(); } private getVirtualMemorySo(item: any): void { @@ -828,22 +844,8 @@ export class TabPaneVirtualMemoryStatisticsAnalysis extends BaseElement { return; } for (let vmItemData of this.vmStatisticsAnalysisProcessData) { - if (!this.hideProcessCheckBox?.checked && !this.hideThreadCheckBox?.checked) { - if (item && (vmItemData.pid !== item.pid || vmItemData.tid !== item.tid || vmItemData.type !== item.type)) { - continue; - } - } else if (!this.hideProcessCheckBox?.checked && this.hideThreadCheckBox?.checked) { - if (item && (vmItemData.pid !== item.pid || vmItemData.type !== item.type)) { - continue; - } - } else if (this.hideProcessCheckBox?.checked && !this.hideThreadCheckBox?.checked) { - if ((item && vmItemData.tid !== item.tid) || vmItemData.type !== item.type) { - continue; - } - } else if (this.hideProcessCheckBox?.checked && this.hideThreadCheckBox?.checked) { - if (item && vmItemData.type !== item.type) { - continue; - } + if (this.soIsAccumulationData(item, vmItemData)) { + continue; } allDur += vmItemData.dur; if (libMap.has(vmItemData.libId)) { @@ -854,6 +856,27 @@ export class TabPaneVirtualMemoryStatisticsAnalysis extends BaseElement { libMap.set(vmItemData.libId, dataArray); } } + this.updateVmSoData(libMap, item, allDur); + this.libStatisticsData = this.totalDurationData(allDur); + this.currentLevel = 3; + this.vmStatisticsAnalysisProgressEL!.loading = false; + this.libraryPieChart(); + } + + private soIsAccumulationData(item: any, vmItemData: any): boolean { + if (!this.hideProcessCheckBox?.checked && !this.hideThreadCheckBox?.checked) { + return item && (vmItemData.pid !== item.pid || vmItemData.tid !== item.tid || vmItemData.type !== item.type); + } else if (!this.hideProcessCheckBox?.checked && this.hideThreadCheckBox?.checked) { + return item && (vmItemData.pid !== item.pid || vmItemData.type !== item.type); + } else if (this.hideProcessCheckBox?.checked && !this.hideThreadCheckBox?.checked) { + return (item && vmItemData.tid !== item.tid) || vmItemData.type !== item.type; + } else if (this.hideProcessCheckBox?.checked && this.hideThreadCheckBox?.checked) { + return item && vmItemData.type !== item.type; + } + return false; + } + + private updateVmSoData(libMap: Map>, item: any, allDur: number): void { this.vmStatisticsAnalysisSoData = []; libMap.forEach((value: any[], key: number) => { let dur = 0; @@ -882,10 +905,6 @@ export class TabPaneVirtualMemoryStatisticsAnalysis extends BaseElement { this.vmStatisticsAnalysisSoData.push(soData); }); this.vmStatisticsAnalysisSoData.sort((a, b) => b.duration - a.duration); - this.libStatisticsData = this.totalDurationData(allDur); - this.currentLevel = 3; - this.vmStatisticsAnalysisProgressEL!.loading = false; - this.libraryPieChart(); } private getVirtualMemoryFunction(item: any): void { @@ -901,27 +920,8 @@ export class TabPaneVirtualMemoryStatisticsAnalysis extends BaseElement { return; } for (let vmProcessData of this.vmStatisticsAnalysisProcessData) { - if (!this.hideProcessCheckBox?.checked && !this.hideThreadCheckBox?.checked) { - if ( - vmProcessData.pid !== pid || - vmProcessData.tid !== tid || - vmProcessData.type !== type || - vmProcessData.libId !== libId - ) { - continue; - } - } else if (!this.hideProcessCheckBox?.checked && this.hideThreadCheckBox?.checked) { - if (vmProcessData.pid !== pid || vmProcessData.type !== type || vmProcessData.libId !== libId) { - continue; - } - } else if (this.hideProcessCheckBox?.checked && !this.hideThreadCheckBox?.checked) { - if (vmProcessData.tid !== tid || vmProcessData.type !== type || vmProcessData.libId !== libId) { - continue; - } - } else if (this.hideProcessCheckBox?.checked && this.hideThreadCheckBox?.checked) { - if (vmProcessData.type !== type || vmProcessData.libId !== libId) { - continue; - } + if (this.vmFunctionIsAccumulationData(vmProcessData, tid, pid, type, libId)) { + continue; } allDur += vmProcessData.dur; if (symbolMap.has(vmProcessData.symbolId)) { @@ -932,37 +932,22 @@ export class TabPaneVirtualMemoryStatisticsAnalysis extends BaseElement { symbolMap.set(vmProcessData.symbolId, dataArray); } } - this.vmStatisticsAnalysisFunctionData = []; - symbolMap.forEach((symbolItems, key) => { - let dur = 0; - let symbolName = ''; - for (let symbolItem of symbolItems) { - symbolName = symbolItem.symbolName; - dur += symbolItem.dur; - } - let symbolPath = symbolName?.split('/'); - if (symbolPath) { - symbolName = symbolPath[symbolPath.length - 1]; - } - const symbolData = { - pid: item.pid, - type: item.type, - tid: item.tid, - libId: item.libId, - symbol: key, - percent: ((dur / allDur) * 100).toFixed(2), - tableName: symbolName, - durFormat: Utils.getProbablyTime(dur), - duration: dur, - }; - this.vmStatisticsAnalysisFunctionData.push(symbolData); - }); - this.vmStatisticsAnalysisFunctionData.sort((a, b) => b.duration - a.duration); + this.updateVmFunctionData(symbolMap, item, allDur); this.functionStatisticsData = this.totalDurationData(allDur); this.currentLevel = 4; // @ts-ignore this.sumDur = this.libStatisticsData.allDuration; this.vmStatisticsAnalysisProgressEL!.loading = false; + this.setVmPieChartConfig(); + this.vmStatisticsAnalysisFunctionData.unshift(this.functionStatisticsData); + this.vmStatisticsAnalysisTableFunction!.recycleDataSource = this.vmStatisticsAnalysisFunctionData; + this.vmStatisticsAnalysisTableFunction?.reMeauseHeight(); + // @ts-ignore + this.vmStatisticsAnalysisFunctionData.shift(this.functionStatisticsData); + this.currentLevelData = this.vmStatisticsAnalysisFunctionData; + } + + private setVmPieConfig() { this.vmPieChart!.config = { appendPadding: 0, data: this.getVmPieChartData(this.vmStatisticsAnalysisFunctionData), @@ -993,12 +978,49 @@ export class TabPaneVirtualMemoryStatisticsAnalysis extends BaseElement { }, ], }; - this.vmStatisticsAnalysisFunctionData.unshift(this.functionStatisticsData); - this.vmStatisticsAnalysisTableFunction!.recycleDataSource = this.vmStatisticsAnalysisFunctionData; - this.vmStatisticsAnalysisTableFunction?.reMeauseHeight(); - // @ts-ignore - this.vmStatisticsAnalysisFunctionData.shift(this.functionStatisticsData); - this.currentLevelData = this.vmStatisticsAnalysisFunctionData; + } + + private vmFunctionIsAccumulationData(vmProcessData: any, tid: number, pid: number, type: string, libId: number) { + if (!this.hideProcessCheckBox?.checked && !this.hideThreadCheckBox?.checked) { + return vmProcessData.pid !== pid || vmProcessData.tid !== tid || vmProcessData.type !== type || + vmProcessData.libId !== libId; + } else if (!this.hideProcessCheckBox?.checked && this.hideThreadCheckBox?.checked) { + return vmProcessData.pid !== pid || vmProcessData.type !== type || vmProcessData.libId !== libId; + } else if (this.hideProcessCheckBox?.checked && !this.hideThreadCheckBox?.checked) { + return vmProcessData.tid !== tid || vmProcessData.type !== type || vmProcessData.libId !== libId; + } else if (this.hideProcessCheckBox?.checked && this.hideThreadCheckBox?.checked) { + return vmProcessData.type !== type || vmProcessData.libId !== libId; + } + return false; + } + + private updateVmFunctionData(symbolMap: Map>, item: any, allDur: number): void { + this.vmStatisticsAnalysisFunctionData = []; + symbolMap.forEach((symbolItems, key) => { + let dur = 0; + let symbolName = ''; + for (let symbolItem of symbolItems) { + symbolName = symbolItem.symbolName; + dur += symbolItem.dur; + } + let symbolPath = symbolName?.split('/'); + if (symbolPath) { + symbolName = symbolPath[symbolPath.length - 1]; + } + const symbolData = { + pid: item.pid, + type: item.type, + tid: item.tid, + libId: item.libId, + symbol: key, + percent: ((dur / allDur) * 100).toFixed(2), + tableName: symbolName, + durFormat: Utils.getProbablyTime(dur), + duration: dur, + }; + this.vmStatisticsAnalysisFunctionData.push(symbolData); + }); + this.vmStatisticsAnalysisFunctionData.sort((a, b) => b.duration - a.duration); } private typeIdToString(type: number): string { @@ -1054,7 +1076,7 @@ export class TabPaneVirtualMemoryStatisticsAnalysis extends BaseElement { procedurePool.submitWithName( 'logic0', 'fileSystem-action', - { args, callType: 'virtualMemory', isAnalysis: true }, + {args, callType: 'virtualMemory', isAnalysis: true}, undefined, (results: any) => { handler(results); diff --git a/ide/src/trace/component/trace/sheet/hiperf/TabPanePerfAnalysis.ts b/ide/src/trace/component/trace/sheet/hiperf/TabPanePerfAnalysis.ts index 5ded46a6..e5542c22 100644 --- a/ide/src/trace/component/trace/sheet/hiperf/TabPanePerfAnalysis.ts +++ b/ide/src/trace/component/trace/sheet/hiperf/TabPanePerfAnalysis.ts @@ -81,8 +81,9 @@ export class TabPanePerfAnalysis extends BaseElement { this.hideThreadCheckBox!.checked = false; this.reset(this.perfTableProcess!, false); this.titleEl!.textContent = ''; - this.perfAnalysisRange!.textContent = - `Selected range: ${ parseFloat(((val.rightNs - val.leftNs) / 1000000.0).toFixed(5)) } ms`; + this.perfAnalysisRange!.textContent = `Selected range: ${parseFloat( + ((val.rightNs - val.leftNs) / 1000000.0).toFixed(5) + )} ms`; if (!this.callChainMap) { this.getCallChainDataFromWorker(val); } @@ -125,7 +126,7 @@ export class TabPanePerfAnalysis extends BaseElement { if (this.titleEl?.textContent === '') { title = detail.data.tableName; } else { - title = `${this.titleEl?.textContent } / ${ detail.data.tableName}`; + title = `${this.titleEl?.textContent} / ${detail.data.tableName}`; } perfProfileTab!.pieTitle = title; // 是否是在表格上右键点击跳转到火焰图的 @@ -342,7 +343,9 @@ export class TabPanePerfAnalysis extends BaseElement { }; this.titleEl!.textContent = ''; this.tabName!.textContent = 'Statistic By Process Count'; - this.pidData.unshift(this.allProcessCount); + if (this.pidData.length > 0) { + this.pidData.unshift(this.allProcessCount); + } this.perfTableProcess!.recycleDataSource = this.pidData; this.perfTableProcess?.reMeauseHeight(); // @ts-ignore @@ -402,7 +405,7 @@ export class TabPanePerfAnalysis extends BaseElement { this.perfTableThread!.mouseOut(); } }, - interactions: [{type: 'element-active',}], + interactions: [{ type: 'element-active' }], }; this.tabName!.textContent = 'Statistic By Thread Count'; this.threadData.unshift(this.allThreadCount); @@ -418,7 +421,7 @@ export class TabPanePerfAnalysis extends BaseElement { this.getHiperfSo(it, val); let pName = this.processName; if (this.processName.length > 0 && it.tableName.length > 0) { - pName = `${this.processName } / `; + pName = `${this.processName} / `; } this.titleEl!.textContent = pName + it.tableName; // @ts-ignore @@ -473,7 +476,7 @@ export class TabPanePerfAnalysis extends BaseElement { this.initPerfAnalysisPieConfig(); let pName = this.processName; if (this.processName.length > 0 && this.threadName.length > 0) { - pName = `${this.processName } / `; + pName = `${this.processName} / `; } this.titleEl!.textContent = pName + this.threadName; this.tabName!.textContent = 'Statistic By Library Count'; @@ -490,10 +493,10 @@ export class TabPanePerfAnalysis extends BaseElement { this.getHiperfFunction(it); let title = ''; if (this.processName.length > 0) { - title += `${this.processName } / `; + title += `${this.processName} / `; } if (this.threadName.length > 0) { - title += `${this.threadName } / `; + title += `${this.threadName} / `; } if (it.tableName.length > 0) { title += it.tableName; @@ -543,7 +546,7 @@ export class TabPanePerfAnalysis extends BaseElement { } } - private sortTypeNoZero(currentTable: LitTable): void{ + private sortTypeNoZero(currentTable: LitTable): void { let array = [...this.currentLevelData]; if (this.sortColumn === 'tableName') { currentTable!.recycleDataSource = array.sort((leftA, rightB) => { @@ -591,7 +594,7 @@ export class TabPanePerfAnalysis extends BaseElement { currentTable!.recycleDataSource = array; } - private initHiPerfProcessSelect(val: SelectionParam): void{ + private initHiPerfProcessSelect(val: SelectionParam): void { this.reset(this.perfTableProcess!, false); this.progressEL!.loading = true; if (!this.processData || this.processData.length === 0) { @@ -617,7 +620,7 @@ export class TabPanePerfAnalysis extends BaseElement { let pidMap = new Map>(); if (val.perfThread.length > 0 && val.perfProcess.length === 0) { this.perfTableProcess!.style.display = 'none'; - this.getHiperfThread(this.processData[0], val); + this.getHiperfThread(null, val); } else { for (let itemData of this.processData) { allCount += itemData.count; @@ -638,7 +641,7 @@ export class TabPanePerfAnalysis extends BaseElement { count += item.count; eventCount += item.eventCount; } - const pName = `${arr[0].processName }(${ pid })`; + const pName = `${arr[0].processName}(${pid})`; const pidData = { tableName: pName, pid: pid, @@ -683,7 +686,7 @@ export class TabPanePerfAnalysis extends BaseElement { threadMap.forEach((arr: Array, tid: number) => { let threadCount = 0; let threadEventCount = 0; - let tName = `${arr[0].threadName }(${ tid })`; + let tName = `${arr[0].threadName}(${tid})`; for (let item of arr) { threadCount += item.count; threadEventCount += item.eventCount; @@ -738,12 +741,12 @@ export class TabPanePerfAnalysis extends BaseElement { } allCount += itemData.count; allEventCount += itemData.eventCount; - if (libMap.has(`${itemData.libId }-${ itemData.libName}`)) { - libMap.get(`${itemData.libId }-${ itemData.libName}`)?.push(itemData); + if (libMap.has(`${itemData.libId}-${itemData.libName}`)) { + libMap.get(`${itemData.libId}-${itemData.libName}`)?.push(itemData); } else { let dataArray: Array = []; dataArray.push(itemData); - libMap.set(`${itemData.libId }-${ itemData.libName}`, dataArray); + libMap.set(`${itemData.libId}-${itemData.libName}`, dataArray); } } if (!item) { @@ -799,12 +802,12 @@ export class TabPanePerfAnalysis extends BaseElement { } allCount += itemData.count; allEventCount += itemData.eventCount; - if (symbolMap.has(`${itemData.symbolId }-${ itemData.symbolName}`)) { - symbolMap.get(`${itemData.symbolId }-${ itemData.symbolName}`)?.push(itemData); + if (symbolMap.has(`${itemData.symbolId}-${itemData.symbolName}`)) { + symbolMap.get(`${itemData.symbolId}-${itemData.symbolName}`)?.push(itemData); } else { let dataArray: Array = []; dataArray.push(itemData); - symbolMap.set(`${itemData.symbolId }-${ itemData.symbolName}`, dataArray); + symbolMap.set(`${itemData.symbolId}-${itemData.symbolName}`, dataArray); } } this.functionData = []; @@ -958,8 +961,12 @@ export class TabPanePerfAnalysis extends BaseElement { private getCallChainDataFromWorker(val: SelectionParam): void { this.getDataByWorker(val, (results: any) => { this.processData = results; - if (!this.processData[0].processName) { - console.log(this.processData); + if (this.processData.length === 0) { + this.hideProcessCheckBox?.setAttribute('disabled', 'disabled'); + this.hideThreadCheckBox?.setAttribute('disabled', 'disabled'); + } else { + this.hideProcessCheckBox?.removeAttribute('disabled'); + this.hideThreadCheckBox?.removeAttribute('disabled'); } this.getHiperfProcess(val); }); @@ -989,13 +996,13 @@ export class TabPanePerfAnalysis extends BaseElement { public connectedCallback(): void { new ResizeObserver(() => { - this.perfTableProcess!.style.height = `${this.parentElement!.clientHeight - 50 }px`; + this.perfTableProcess!.style.height = `${this.parentElement!.clientHeight - 50}px`; this.perfTableProcess?.reMeauseHeight(); - this.perfTableThread!.style.height = `${this.parentElement!.clientHeight - 50 }px`; + this.perfTableThread!.style.height = `${this.parentElement!.clientHeight - 50}px`; this.perfTableThread?.reMeauseHeight(); - this.tableFunction!.style.height = `${this.parentElement!.clientHeight - 50 }px`; + this.tableFunction!.style.height = `${this.parentElement!.clientHeight - 50}px`; this.tableFunction?.reMeauseHeight(); - this.perfTableSo!.style.height = `${this.parentElement!.clientHeight - 50 }px`; + this.perfTableSo!.style.height = `${this.parentElement!.clientHeight - 50}px`; this.perfTableSo?.reMeauseHeight(); if (this.parentElement!.clientHeight >= 0 && this.parentElement!.clientHeight <= 31) { this.filterEl!.style.display = 'none'; diff --git a/ide/src/trace/component/trace/sheet/jank/TabPaneFrames.ts b/ide/src/trace/component/trace/sheet/jank/TabPaneFrames.ts index cca7e770..bc7cdb6d 100644 --- a/ide/src/trace/component/trace/sheet/jank/TabPaneFrames.ts +++ b/ide/src/trace/component/trace/sheet/jank/TabPaneFrames.ts @@ -64,30 +64,40 @@ export class TabPaneFrames extends BaseElement { } }); tablelist.push(sumRes); - if (appJank.occurrences > 0) { - appJank.maxDurationStr = appJank.maxDuration + ''; - appJank.minDurationStr = appJank.minDuration + ''; - appJank.meanDurationStr = appJank.meanDuration + ''; - tablelist.push(appJank); - } - if (rsJank.occurrences > 0) { - rsJank.maxDurationStr = rsJank.maxDuration + ''; - rsJank.minDurationStr = rsJank.minDuration + ''; - rsJank.meanDurationStr = rsJank.meanDuration + ''; - tablelist.push(rsJank); - } - if (noJank.occurrences > 0) { - noJank.maxDurationStr = noJank.maxDuration + ''; - noJank.minDurationStr = noJank.minDuration + ''; - noJank.meanDurationStr = noJank.meanDuration + ''; - tablelist.push(noJank); - } + tablelist = this.setFrameDataDur(appJank, rsJank, noJank, tablelist); this.framesSource = tablelist; this.framesTbl!.recycleDataSource = tablelist; }); } } + private setFrameDataDur( + appFrame: JankFramesStruct, + rsFrame: JankFramesStruct, + noFrame: JankFramesStruct, + tableList: JankFramesStruct[] + ): JankFramesStruct[] { + if (appFrame.occurrences > 0) { + appFrame.maxDurationStr = appFrame.maxDuration + ''; + appFrame.minDurationStr = appFrame.minDuration + ''; + appFrame.meanDurationStr = appFrame.meanDuration + ''; + tableList.push(appFrame); + } + if (rsFrame.occurrences > 0) { + rsFrame.maxDurationStr = rsFrame.maxDuration + ''; + rsFrame.minDurationStr = rsFrame.minDuration + ''; + rsFrame.meanDurationStr = rsFrame.meanDuration + ''; + tableList.push(rsFrame); + } + if (noFrame.occurrences > 0) { + noFrame.maxDurationStr = noFrame.maxDuration + ''; + noFrame.minDurationStr = noFrame.minDuration + ''; + noFrame.meanDurationStr = noFrame.meanDuration + ''; + tableList.push(noFrame); + } + return tableList; + } + private frameTimelineJankDataHandle( structValue: JanksStruct, appJank: JankFramesStruct, diff --git a/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMSampleList.ts b/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMSampleList.ts index a9e6b71f..59f07373 100644 --- a/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMSampleList.ts +++ b/ide/src/trace/component/trace/sheet/native-memory/TabPaneNMSampleList.ts @@ -169,21 +169,7 @@ export class TabPaneNMSampleList extends BaseElement { } } }); - if (this.sampleTypesList.length > 0) { - let sampleTypesListElement = this.sampleTypesList[this.sampleTypesList.length - 1]; - sampleTypesListElement.forEach((item: any, index: number) => { - copyTypes[index].current = copyTypes[index].growth; - if (index < copyTypes.length) { - copyTypes[index].growth -= item.current; - copyTypes[index].total -= item.total; - } - }); - } else { - copyTypes.forEach((item: any) => { - item.current = item.growth; - }); - } - this.sampleTypesList.push(copyTypes); + this.updateSampleTypesList(copyTypes); this.createTree(nameGroup, rootSample); rootSample.tempList = [...rootSample.children]; this.samplerInfoSource.push(rootSample); @@ -192,6 +178,24 @@ export class TabPaneNMSampleList extends BaseElement { }); } + private static updateSampleTypesList(copyTypes: NativeHookSampleQueryInfo[]): void { + if (this.sampleTypesList.length > 0) { + let sampleTypesListElement = this.sampleTypesList[this.sampleTypesList.length - 1]; + sampleTypesListElement.forEach((item: any, index: number) => { + copyTypes[index].current = copyTypes[index].growth; + if (index < copyTypes.length) { + copyTypes[index].growth -= item.current; + copyTypes[index].total -= item.total; + } + }); + } else { + copyTypes.forEach((item: any) => { + item.current = item.growth; + }); + } + this.sampleTypesList.push(copyTypes); + } + static createTree(nameGroup: any, rootSample: NativeHookSamplerInfo): void { Object.keys(nameGroup).forEach((key) => { let parentSample = new NativeHookSamplerInfo(); diff --git a/ide/src/trace/component/trace/sheet/process/TabPaneStartup.ts b/ide/src/trace/component/trace/sheet/process/TabPaneStartup.ts index fdf38dee..aef77ad5 100644 --- a/ide/src/trace/component/trace/sheet/process/TabPaneStartup.ts +++ b/ide/src/trace/component/trace/sheet/process/TabPaneStartup.ts @@ -51,60 +51,68 @@ export class TabPaneStartup extends BaseElement { this.startupTbl!.loading = true; getTabStartups(startupParam.processIds, startupParam.leftNs, startupParam.rightNs).then( (result: AppStartupStruct[]) => { - this.startupTbl!.loading = false; - if (result !== null && result.length > 0) { - log(`getTabStartups result size : ${ result.length}`); - let map: Map = new Map(); - result.forEach((item) => { - let startup = { - name: AppStartupStruct.getStartupName(item.startName), - dur: item.dur || 0, - durStr: getProbablyTime(item.dur || 0), - ratio: '0%', - step: item.startName || 0, - children: [], - }; - if (map.has(item.pid!)) { - let ps = map.get(item.pid!); - if (ps && ps.children) { - ps.dur += item.dur || 0; - ps.children!.push(startup); - } - } else { - map.set(item.pid!, { - name: item.process || `Process ${item.pid}`, - dur: item.dur || 0, - durStr: '', - ratio: '100%', - step: 0, - children: [startup], - }); - } - }); - let startups = Array.from(map.values()); - startups.forEach((it) => { - it.durStr = getProbablyTime(it.dur); - if (it.dur === 0) { - it.ratio = '0%'; - } - it.children!.forEach((child) => { - if (it.dur === 0) { - child.ratio = '0%'; - } else { - child.ratio = `${((child.dur * 100) / it.dur).toFixed(2) }%`; - } - }); - }); - this.startupSource = startups; - this.startupTbl!.recycleDataSource = this.startupSource; - } else { - this.startupSource = []; - this.startupTbl!.recycleDataSource = []; - } + this.processTabStartups(result); } ); } + private processTabStartups(result: AppStartupStruct[]): void { + this.startupTbl!.loading = false; + if (result !== null && result.length > 0) { + log(`getTabStartups result size : ${result.length}`); + let map: Map = new Map(); + result.forEach((item) => { + this.processStartupItem(item, map); + }); + let startups = Array.from(map.values()); + startups.forEach((it) => { + it.durStr = getProbablyTime(it.dur); + if (it.dur === 0) { + it.ratio = '0%'; + } + it.children!.forEach((child) => { + if (it.dur === 0) { + child.ratio = '0%'; + } else { + child.ratio = `${((child.dur * 100) / it.dur).toFixed(2)}%`; + } + }); + }); + this.startupSource = startups; + this.startupTbl!.recycleDataSource = this.startupSource; + } else { + this.startupSource = []; + this.startupTbl!.recycleDataSource = []; + } + } + + private processStartupItem(item: AppStartupStruct, map: Map): void { + let startup = { + name: AppStartupStruct.getStartupName(item.startName), + dur: item.dur || 0, + durStr: getProbablyTime(item.dur || 0), + ratio: '0%', + step: item.startName || 0, + children: [], + }; + if (map.has(item.pid!)) { + let ps = map.get(item.pid!); + if (ps && ps.children) { + ps.dur += item.dur || 0; + ps.children!.push(startup); + } + } else { + map.set(item.pid!, { + name: item.process || `Process ${item.pid}`, + dur: item.dur || 0, + durStr: '', + ratio: '100%', + step: 0, + children: [startup], + }); + } + } + initElements(): void { this.startupTbl = this.shadowRoot?.querySelector('#tb-startup'); this.range = this.shadowRoot?.querySelector('#startup-time-range'); diff --git a/ide/test/trace/database/data-trafic/CpuDataSender.test.ts b/ide/src/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShm.html.ts similarity index 30% rename from ide/test/trace/database/data-trafic/CpuDataSender.test.ts rename to ide/src/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShm.html.ts index 01a67bb2..9b39a99b 100644 --- a/ide/test/trace/database/data-trafic/CpuDataSender.test.ts +++ b/ide/src/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShm.html.ts @@ -13,44 +13,52 @@ * limitations under the License. */ -import { threadPool } from '../../../../src/trace/database/SqlLite'; -import { TraceRow } from '../../../../src/trace/component/trace/base/TraceRow'; -import { CpuStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerCPU'; -import { QueryEnum } from '../../../../src/trace/database/data-trafic/QueryEnum'; -import { cpuDataSender } from '../../../../src/trace/database/data-trafic/CpuDataSender'; - -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); -describe('CpuDataSender Test', () => { - let CpuData = [{ - processId: 182, - cpu: 0, - tid: 182, - id: 76, - dur: 198041, - startTime: 667008776, - end_state: 'S', - priority: 4294967295, - processName: 'sugov:0', - processCmdLine: 'sugov:0', - name: 'sugov:0', - type: 'thread', - frame: { - y: 5, - height: 30, - x: 4, - width: 1 - }, - translateY: 0 - }]; - it('CpuDataSenderTest01 ', function () { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(CpuData, CpuData.length, true); - }); - let CpuDataTraceRow = TraceRow.skeleton(); - cpuDataSender(QueryEnum.CpuData, CpuDataTraceRow).then(res => { - expect(res).toHaveLength(1); - }); - }); -}); \ No newline at end of file +export const TabPaneVmTrackerShmHtml = ` + + + + + + + + + + +`; diff --git a/ide/src/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShm.ts b/ide/src/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShm.ts index a83412bd..4148e58e 100644 --- a/ide/src/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShm.ts +++ b/ide/src/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShm.ts @@ -19,6 +19,7 @@ import { Utils } from '../../base/Utils'; import { MemoryConfig } from '../../../../bean/MemoryConfig'; import { ns2s } from '../../../../database/ui-worker/ProcedureWorkerCommon'; import {queryVmTrackerShmSizeData} from "../../../../database/sql/Memory.sql"; +import { TabPaneVmTrackerShmHtml } from './TabPaneVmTrackerShm.html'; @element('tabpane-vmtracker-shm') export class TabPaneVmTrackerShm extends BaseElement { @@ -130,54 +131,6 @@ export class TabPaneVmTrackerShm extends BaseElement { } initHtml(): string { - return ` - - - - - - - - - - - `; + return TabPaneVmTrackerShmHtml; } } diff --git a/ide/test/trace/database/data-trafic/ClockDataSender.test.ts b/ide/src/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShmComparison.html.ts similarity index 31% rename from ide/test/trace/database/data-trafic/ClockDataSender.test.ts rename to ide/src/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShmComparison.html.ts index 03108865..c420ef95 100644 --- a/ide/test/trace/database/data-trafic/ClockDataSender.test.ts +++ b/ide/src/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShmComparison.html.ts @@ -13,36 +13,58 @@ * limitations under the License. */ -import { threadPool } from '../../../../src/trace/database/SqlLite'; -import { TraceRow } from '../../../../src/trace/component/trace/base/TraceRow'; -import { ClockStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerClock'; -import { QueryEnum } from '../../../../src/trace/database/data-trafic/QueryEnum'; -import { clockDataSender } from '../../../../src/trace/database/data-trafic/ClockDataSender'; -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); -describe('ClockDataSender Test',()=>{ - let clockData = [{ - filterId: 89, - value: 48000, - startNS: 197364063, - dur: 230475000, - type: "measure", - delta: 0, - frame: { - y: 5, - height: 30, - x: 11, - width: 14 - } - }] - it('ClockDataSenderTest01 ', function () { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(clockData, clockData.length, true); - }); - let clockTraceRow = TraceRow.skeleton(); - clockDataSender( '','screenState',clockTraceRow).then(result => { - expect(result).toHaveLength(1); - }); - }); -}) \ No newline at end of file +export const TabPaneVmTrackerShmComparisonHtml = ` + +
+ + +
+ + + + +
+
+
+ + +
+
+`; diff --git a/ide/src/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShmComparison.ts b/ide/src/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShmComparison.ts index df8c2930..6cd5754b 100644 --- a/ide/src/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShmComparison.ts +++ b/ide/src/trace/component/trace/sheet/vmtracker/TabPaneVmTrackerShmComparison.ts @@ -12,17 +12,18 @@ * See the License for the specific language governing permissions and * limitations under the License. */ + import { BaseElement, element } from '../../../../../base-ui/BaseElement'; import { type LitTable } from '../../../../../base-ui/table/lit-table'; import { type SnapshotStruct } from '../../../../database/ui-worker/ProcedureWorkerSnapshot'; import { MemoryConfig } from '../../../../bean/MemoryConfig'; -import { ns2s } from '../../../../database/ui-worker/ProcedureWorkerCommon'; import { Utils } from '../../base/Utils'; import { LitSelectOption } from '../../../../../base-ui/select/LitSelectOption'; import { type LitSelect } from '../../../../../base-ui/select/LitSelect'; import { type TabPaneJsMemoryFilter } from '../TabPaneJsMemoryFilter'; import { resizeObserverFromMemory } from '../SheetUtils'; -import {queryVmTrackerShmSelectionData} from "../../../../database/sql/Memory.sql"; +import { queryVmTrackerShmSelectionData } from '../../../../database/sql/Memory.sql'; +import { TabPaneVmTrackerShmComparisonHtml } from './TabPaneVmTrackerShmComparison.html'; @element('tabpane-vmtracker-shm-comparison') export class TabPaneVmTrackerShmComparison extends BaseElement { @@ -144,61 +145,7 @@ export class TabPaneVmTrackerShmComparison extends BaseElement { } initHtml(): string { - return ` - -
- - -
- - - - -
-
-
- - -
-
- `; + return TabPaneVmTrackerShmComparisonHtml; } } diff --git a/ide/src/trace/component/trace/timer-shaft/RangeRuler.ts b/ide/src/trace/component/trace/timer-shaft/RangeRuler.ts index 24ed71af..c0523626 100644 --- a/ide/src/trace/component/trace/timer-shaft/RangeRuler.ts +++ b/ide/src/trace/component/trace/timer-shaft/RangeRuler.ts @@ -197,64 +197,72 @@ export class RangeRuler extends Graph { this.range.endX = this.rangeRect.x + this.rangeRect.width; this.range.startNS = (this.range.startX * this.range.totalNS) / (this.canvas?.clientWidth || 0); this.range.endNS = (this.range.endX * this.range.totalNS) / (this.canvas?.clientWidth || 0); - let l20 = (this.range.endNS - this.range.startNS) / 20; - let minScale = 0; - let maxScale = 0; - let weight = 0; - for (let scalesIndex = 0; scalesIndex < this.scales.length; scalesIndex++) { - if (this.scales[scalesIndex] > l20) { - if (scalesIndex > 0) { - minScale = this.scales[scalesIndex - 1]; - } else { - minScale = 0; - } - maxScale = this.scales[scalesIndex]; - weight = ((l20 - minScale) * 1.0) / (maxScale - minScale); - if (weight > 0.243) { - this.scale = maxScale; - } else { - this.scale = minScale; - } - break; - } - } - if (this.scale === 0) { - this.scale = this.scales[0]; - } - let tempNs = 0; - let rangeStartX = 0; - let rangeYu = this.range.startNS % this.scale; - let rangeRealW = (this.scale * this.frame.width) / (this.range.endNS - this.range.startNS); - if (this.range.xsTxt) { - this.range.xsTxt.length = 0; - } else { - this.range.xsTxt = []; - } - if (this.range.xs) { - this.range.xs.length = 0; - } else { - this.range.xs = []; - } - this.range.scale = this.scale; - if (rangeYu !== 0) { - let first_NodeWidth = ((this.scale - rangeYu) / this.scale) * rangeRealW; - rangeStartX += first_NodeWidth; - tempNs += this.scale - rangeYu; - this.range.xs.push(rangeStartX); - this.range.xsTxt.push(ns2UnitS(tempNs + this.range.startNS, this.scale)); - } - while (tempNs < this.range.endNS - this.range.startNS) { - rangeStartX += rangeRealW; - tempNs += this.scale; - this.range.xs.push(rangeStartX); - this.range.xsTxt.push(ns2UnitS(tempNs + this.range.startNS, this.scale)); - } + this.calculateScale(); + this.updateRange(); if (!discardNotify) { this.notifyHandler(this.range); } } } + private updateRange(): void { + let tempNs = 0; + let rangeStartX = 0; + let rangeYu = this.range.startNS % this.scale; + let rangeRealW = (this.scale * this.frame.width) / (this.range.endNS - this.range.startNS); + if (this.range.xsTxt) { + this.range.xsTxt.length = 0; + } else { + this.range.xsTxt = []; + } + if (this.range.xs) { + this.range.xs.length = 0; + } else { + this.range.xs = []; + } + this.range.scale = this.scale; + if (rangeYu !== 0) { + let first_NodeWidth = ((this.scale - rangeYu) / this.scale) * rangeRealW; + rangeStartX += first_NodeWidth; + tempNs += this.scale - rangeYu; + this.range.xs.push(rangeStartX); + this.range.xsTxt.push(ns2UnitS(tempNs + this.range.startNS, this.scale)); + } + while (tempNs < this.range.endNS - this.range.startNS) { + rangeStartX += rangeRealW; + tempNs += this.scale; + this.range.xs.push(rangeStartX); + this.range.xsTxt.push(ns2UnitS(tempNs + this.range.startNS, this.scale)); + } + } + + private calculateScale(): void { + let l20 = (this.range.endNS - this.range.startNS) / 20; + let minScale = 0; + let maxScale = 0; + let weight = 0; + for (let scalesIndex = 0; scalesIndex < this.scales.length; scalesIndex++) { + if (this.scales[scalesIndex] > l20) { + if (scalesIndex > 0) { + minScale = this.scales[scalesIndex - 1]; + } else { + minScale = 0; + } + maxScale = this.scales[scalesIndex]; + weight = ((l20 - minScale) * 1.0) / (maxScale - minScale); + if (weight > 0.243) { + this.scale = maxScale; + } else { + this.scale = minScale; + } + break; + } + } + if (this.scale === 0) { + this.scale = this.scales[0]; + } + } + private drawSelectionRange(): void { this.context2D.fillStyle = window.getComputedStyle(this.canvas!, null).getPropertyValue('background-color'); this.rangeRect.x = this.markAObj.frame.x < this.markBObj.frame.x ? this.markAObj.frame.x : this.markBObj.frame.x; @@ -333,32 +341,11 @@ export class RangeRuler extends Graph { this.markAObj.isHover = false; this.markBObj.isHover = false; } - if (this.movingMark) { - let result = move_x - this.mouseDownOffsetX + this.mouseDownMovingMarkX; - if (result >= 0 && result <= maxX) { - this.movingMark.frame.x = result; - } else if (result < 0) { - this.movingMark.frame.x = 0; - } else { - this.movingMark.frame.x = maxX; - } - this.movingMark.inspectionFrame.x = this.movingMark.frame.x - MarkPadding; - this.recordMovingS(); - requestAnimationFrame(() => { - this.draw(); - this.range.refresh = false; - this.delayDraw(); - }); - } else if (this.rangeRect.containsWithPadding(move_x, move_y, MarkPadding, 0)) { - trace.style.cursor = 'move'; - document.body.style.cursor = 'move'; - } else if ( - this.frame.containsWithMargin(move_x, move_y, 20, 0, 0, 0) && - !this.rangeRect.containsWithMargin(move_x, move_y, 0, MarkPadding, 0, MarkPadding) - ) { - trace.style.cursor = 'crosshair'; - document.body.style.cursor = 'crosshair'; - } + this.handleMovingMark(move_x, move_y, maxX, trace); + this.handleMovingFresh(move_x, maxX); + } + + private handleMovingFresh(move_x: number, maxX: number): void { if (this.isMovingRange && this.isMouseDown) { let result = move_x - this.mouseDownOffsetX; let mA = result + this.markAX; @@ -405,6 +392,40 @@ export class RangeRuler extends Graph { } } + private handleMovingMark( + move_x: number, + move_y: number, + maxX: number, + trace: SpSystemTrace + ): void { + if (this.movingMark) { + let result = move_x - this.mouseDownOffsetX + this.mouseDownMovingMarkX; + if (result >= 0 && result <= maxX) { + this.movingMark.frame.x = result; + } else if (result < 0) { + this.movingMark.frame.x = 0; + } else { + this.movingMark.frame.x = maxX; + } + this.movingMark.inspectionFrame.x = this.movingMark.frame.x - MarkPadding; + this.recordMovingS(); + requestAnimationFrame(() => { + this.draw(); + this.range.refresh = false; + this.delayDraw(); + }); + } else if (this.rangeRect.containsWithPadding(move_x, move_y, MarkPadding, 0)) { + trace.style.cursor = 'move'; + document.body.style.cursor = 'move'; + } else if ( + this.frame.containsWithMargin(move_x, move_y, 20, 0, 0, 0) && + !this.rangeRect.containsWithMargin(move_x, move_y, 0, MarkPadding, 0, MarkPadding) + ) { + trace.style.cursor = 'crosshair'; + document.body.style.cursor = 'crosshair'; + } + } + recordMovingS() { if (this.animaStartTime == undefined) { let dat = new Date(); @@ -504,190 +525,39 @@ export class RangeRuler extends Graph { } keyPressF(): void { - const DIS = 100; - let clientWidth = this.canvas?.clientWidth || 0; - let midX = Math.round(clientWidth / 2); - let sliceMidX = 0; - let startTime = 0; - let endTime = 0; - this.rulerW = this.canvas!.offsetWidth; - if (this.currentSlicesTime.startTime) { - startTime = this.currentSlicesTime.startTime; - } else { - return; - } - if (this.currentSlicesTime.endTime) { - endTime = this.currentSlicesTime.endTime; - } else { - return; - } - let startX = (this.rulerW * (startTime - this.range.startNS)) / (this.range.endNS - this.range.startNS); - let endX = (this.rulerW * (endTime - this.range.startNS)) / (this.range.endNS - this.range.startNS); - let totalX = 0; - totalX = Math.round(endX - startX); - sliceMidX = Math.round(startX + totalX / 2); - let count1 = 0; - let count2 = 0; - let animF = (): void => { - let sliceMidXMap = new Map(); - startX = (this.rulerW * (startTime - this.range.startNS)) / (this.range.endNS - this.range.startNS); - endX = (this.rulerW * (endTime - this.range.startNS)) / (this.range.endNS - this.range.startNS); - totalX = endX - startX; - sliceMidX = Math.round(startX + totalX / 2); - let x = 1; - do { - startX = (this.rulerW * (startTime - this.range.startNS)) / (this.range.endNS - this.range.startNS); - endX = (this.rulerW * (endTime - this.range.startNS)) / (this.range.endNS - this.range.startNS); - totalX = endX - startX; - sliceMidX = Math.round(startX + (endX - startX) / 2); - if (totalX === 0) { - return; - } - // 修正sliceMidX的值 - if (sliceMidX !== sliceMidXMap.get('tempMid1') || (0 && sliceMidX !== sliceMidXMap.get('tempMid2')) || 0) { - if (x % 2 === 0) { - sliceMidXMap.set('tempMid2', sliceMidX); // 偶数 - } else { - sliceMidXMap.set('tempMid1', sliceMidX); // 奇数 - } - } else { - if (sliceMidX === sliceMidXMap.get('tempMid1')) { - count1++; - } - if (sliceMidX === sliceMidXMap.get('tempMid2')) { - count2++; - } - // 此处为了解决特殊情况下sliceMidX的值非常接近中间区域,但是又无法进入中间区域,导致死循环程序无法正常终止。 - if ((count1 >= 3 && count1 <= 5) || (count2 >= 3 && count2 <= 5)) { - if (sliceMidX >= midX - MID_OFFSET && sliceMidX <= midX + MID_OFFSET) { - let tempMid1 = sliceMidXMap.get('tempMid1') || 0; - let tempMid2 = sliceMidXMap.get('tempMid2') || 0; - if (sliceMidX === tempMid1 && tempMid1 === tempMid2) { - sliceMidX += 11; - } - if (sliceMidX === tempMid1 && sliceMidX !== tempMid2) { - if (sliceMidX < tempMid2) { - sliceMidX += 15; - } else { - sliceMidX -= 10; - } - } - if (sliceMidX === tempMid2 && sliceMidX !== tempMid1) { - if (sliceMidX < tempMid1) { - sliceMidX += 15; - } else { - sliceMidX -= 10; - } - } - } - } - if (count1 > 5 || count2 > 5) { - this.fillX(); - this.range.refresh = true; - this.notifyHandler(this.range); - this.range.refresh = false; - return; - } - } - x++; - if (sliceMidX >= midX - MID_OFFSET && sliceMidX <= midX + MID_OFFSET) { - /* 把 endNS 转换为 endX , startNS 转化 startX, - totalX = ( endX - startX ) 280px <= totalX <= 300px - 此时,如果slice的比例或者宽度不合适,则进行调整校正,缩放到合适的比例。 - 不能使用固定的 scale, 因为调整slice的宽度时,scale、 startNS 和 endNS 都在变化, - 所以要使用 totalX 来判断slice是否缩放到合适的大小了。 - */ - if ( - (totalX < FIT_TOTALX_MIN - MID_OFFSET && totalX > 0) || - Math.round(totalX) > FIT_TOTALX_MAX + MID_OFFSET - ) { - this.zoomFit(startTime, endTime); - this.fillX(); - this.range.refresh = true; - this.notifyHandler(this.range); - this.range.refresh = false; - } - startX = (this.rulerW * (startTime - this.range.startNS)) / (this.range.endNS - this.range.startNS); - endX = (this.rulerW * (endTime - this.range.startNS)) / (this.range.endNS - this.range.startNS); - totalX = endX - startX; - sliceMidX = Math.round(startX + (endX - startX) / 2); - if ( - sliceMidX >= midX - MID_OFFSET && - sliceMidX <= midX + MID_OFFSET && - Math.round(totalX) >= FIT_TOTALX_MIN - MID_OFFSET && - Math.round(totalX) <= FIT_TOTALX_MAX + MID_OFFSET - ) { - this.fillX(); - this.range.refresh = true; - this.notifyHandler(this.range); - this.range.refresh = false; - return; - } - } else { - // 0.2经验值,不要随便调整这个系数,该系数决定了调整后的slice中间位置是否能落在FIT_TOTALX_MIN和FIT_TOTALX_MAX之间。 - let s = (this.scale / this.p) * this.currentDuration * 0.2; // 微调 - let big_s = (this.scale / this.p) * this.currentDuration * 1.2; // 大幅度调整 - let biger = (this.scale / this.p) * this.currentDuration * 10; // 更大幅度调整 - let huge = (this.scale / this.p) * this.currentDuration * 100; // 巨大幅度调整 - startX = (this.rulerW * (startTime - this.range.startNS)) / (this.range.endNS - this.range.startNS); - endX = (this.rulerW * (endTime - this.range.startNS)) / (this.range.endNS - this.range.startNS); - totalX = endX - startX; - sliceMidX = Math.round(startX + (endX - startX) / 2); - // slice中间位置大于画布的中间坐标时画布右移 ,startNS + s - if (sliceMidX > midX + MID_OFFSET) { - let distance = sliceMidX - midX; - if (distance >= 10000) { - this.range.startNS += huge; - this.range.endNS += huge; - } else if (distance >= 1000 && distance < 10000) { - this.range.startNS += biger; - this.range.endNS += biger; - } else if (distance > DIS && distance < 1000) { - this.range.startNS += big_s; - this.range.endNS += big_s; - } else { - this.range.startNS += s; - this.range.endNS += s; - } - } - // slice中间位置小于画布的中间坐标时画布左移, startNS - s - if (sliceMidX < midX - MID_OFFSET) { - let distance = midX - sliceMidX; // 28.5 - if (distance >= 10000) { - this.range.startNS -= huge; - this.range.endNS -= huge; - } else if (distance >= 1000 && distance < 10000) { - this.range.startNS -= biger; - this.range.endNS -= biger; - } else if (distance > DIS && distance < 1000) { - this.range.startNS -= big_s; - this.range.endNS -= big_s; - } else { - this.range.startNS -= s; - this.range.endNS -= s; - } - } - } - this.fillX(); - this.draw(); - this.range.refresh = false; - } while ( - sliceMidX < midX - MID_OFFSET || - sliceMidX > midX + MID_OFFSET || - Math.round(totalX) < FIT_TOTALX_MIN - MID_OFFSET || - Math.round(totalX) > FIT_TOTALX_MAX + MID_OFFSET); + let animF = () => { + let clientWidth = this.canvas?.clientWidth || 0; + let midX = Math.round(clientWidth / 2); + let startTime = 0; + let endTime = 0; + this.rulerW = this.canvas!.offsetWidth; + if (this.currentSlicesTime.startTime) { + startTime = this.currentSlicesTime.startTime; + } else { + return; + } + if (this.currentSlicesTime.endTime) { + endTime = this.currentSlicesTime.endTime; + } else { + return; + } + let startX = midX - 150; + let endX = midX + 150; + this.range.startNS = (endX * startTime - startX * endTime) / (endX - startX); + this.range.endNS = ((this.rulerW * (endTime - this.range.startNS)) + this.range.startNS * endX) / endX; + this.fillX(); + this.draw(); + this.range.refresh = true; + this.notifyHandler(this.range); + this.range.refresh = false; this.pressFrameIdF = requestAnimationFrame(animF); }; - if ((totalX < FIT_TOTALX_MIN - MID_OFFSET && totalX > 0) || totalX > FIT_TOTALX_MAX + MID_OFFSET) { - this.zoomFit(startTime, endTime); - this.pressFrameIdF = requestAnimationFrame(animF); - } this.pressFrameIdF = requestAnimationFrame(animF); - this.zoomFit(startTime, endTime); } fixReg = 76; //速度上线 f = 11; //加速度系数,值越小加速度越大 + keyPressW() { let animW = (): void => { if (this.scale === 50) { @@ -940,174 +810,4 @@ export class RangeRuler extends Graph { this.notifyHandler(this.range); this.range.refresh = false; } - - zoomFit(startTime: number, endTime: number): void { - let startX = (this.rulerW * (startTime - this.range.startNS)) / (this.range.endNS - this.range.startNS); - let endX = (this.rulerW * (endTime - this.range.startNS)) / (this.range.endNS - this.range.startNS); - let totalX = endX - startX; - this.centerXPercentage = 0.5; - let clientWidth = this.canvas?.clientWidth || 0; // 1424 - let midX = Math.round(clientWidth / 2); - this.currentDuration = 1000; - - let totalXMap = new Map(); - let count1 = 0; - let count2 = 0; - let animW = (): void => { - startX = Math.round((this.rulerW * (startTime - this.range.startNS)) / (this.range.endNS - this.range.startNS)); - endX = Math.round((this.rulerW * (endTime - this.range.startNS)) / (this.range.endNS - this.range.startNS)); - totalX = endX - startX; - if (Math.round(totalX) !== totalXMap.get('totalX1')) { - totalXMap.set('totalX1', Math.round(totalX)); - } else { - if (Math.round(totalX) === totalXMap.get('totalX1')) { - count1++; - } - } - if (count1 >= 3 && count1 <= 5) { - if (Math.round(totalX) >= FIT_TOTALX_MIN - MID_OFFSET && Math.round(totalX) <= FIT_TOTALX_MAX + MID_OFFSET) { - let tempTotalX1 = totalXMap.get('totalX1') || 0; - let tempTotalX2 = totalXMap.get('totalX2') || 0; - if (Math.round(totalX) === tempTotalX1 && tempTotalX2 === tempTotalX2) { - totalX += 11; - } - if (Math.round(totalX) === tempTotalX1 && Math.round(totalX) !== tempTotalX2) { - if (Math.round(totalX) < tempTotalX2) { - totalX += 12; - } else { - totalX -= 11; - } - } - if (Math.round(totalX) === tempTotalX2 && Math.round(totalX) !== tempTotalX1) { - if (Math.round(totalX) < tempTotalX1) { - totalX += 12; - } else { - totalX -= 11; - } - } - } - } - // 此处为了解决特殊情况下sliceMidX的值非常接近中间区域,但是又无法进入中间区域,导致死循环程序无法正常终止。 - if (count1 > 5) { - this.fillX(); - this.range.refresh = true; - this.notifyHandler(this.range); - this.range.refresh = false; - // 如果出现循环缩放,则退出。 - return; - } - if (totalX >= FIT_TOTALX_MIN - MID_OFFSET && totalX <= FIT_TOTALX_MAX + MID_OFFSET) { - let sliceMidX = Math.round(startX + totalX / 2); - if (sliceMidX < midX - MID_OFFSET || sliceMidX > midX + MID_OFFSET) { - this.keyPressF(); - } else { - this.fillX(); - this.range.refresh = true; - this.notifyHandler(this.range); - this.range.refresh = false; - return; - } - } - if (this.scale === 50) { - this.fillX(); - this.range.refresh = true; - this.notifyHandler(this.range); - this.range.refresh = false; - return; - } - this.range.startNS += (this.centerXPercentage * this.currentDuration * this.scale) / this.p; - this.range.endNS -= ((1 - this.centerXPercentage) * this.currentDuration * this.scale) / this.p; - this.fillX(); - this.draw(); - this.range.refresh = false; - startX = (this.rulerW * (startTime - this.range.startNS)) / (this.range.endNS - this.range.startNS); - endX = (this.rulerW * (endTime - this.range.startNS)) / (this.range.endNS - this.range.startNS); - totalX = Math.round(endX - startX); - if (totalX >= FIT_TOTALX_MAX + MID_OFFSET) { - this.fillX(); - this.range.refresh = true; - this.notifyHandler(this.range); - this.range.refresh = false; - return; - } - this.pressFrameIdW = requestAnimationFrame(animW); - }; - let animS = (): void => { - startX = Math.round((this.rulerW * (startTime - this.range.startNS)) / (this.range.endNS - this.range.startNS)); - endX = Math.round((this.rulerW * (endTime - this.range.startNS)) / (this.range.endNS - this.range.startNS)); - totalX = endX - startX; - if (Math.round(totalX) !== totalXMap.get('totalX2')) { - totalXMap.set('totalX2', Math.round(totalX)); - } else { - if (Math.round(totalX) === totalXMap.get('totalX2')) { - count2++; - } - } - if (count2 >= 3 && count2 <= 5) { - if (Math.round(totalX) >= FIT_TOTALX_MIN - MID_OFFSET && Math.round(totalX) <= FIT_TOTALX_MAX + MID_OFFSET) { - let tempTotalX1 = totalXMap.get('totalX1') || 0; - let tempTotalX2 = totalXMap.get('totalX2') || 0; - if (Math.round(totalX) === tempTotalX1 && tempTotalX2 === tempTotalX2) { - totalX += 11; - } - if (Math.round(totalX) === tempTotalX1 && Math.round(totalX) !== tempTotalX2) { - if (Math.round(totalX) < tempTotalX2) { - totalX += 12; - } else { - totalX -= 11; - } - } - if (Math.round(totalX) === tempTotalX2 && Math.round(totalX) !== tempTotalX1) { - if (Math.round(totalX) < tempTotalX1) { - totalX += 12; - } else { - totalX -= 11; - } - } - } - } - if (count2 > 5) { - this.fillX(); - this.range.refresh = true; - this.notifyHandler(this.range); - this.range.refresh = false; - // 如果出现循环缩放,则退出。 - return; - } - if (totalX >= FIT_TOTALX_MIN - MID_OFFSET && totalX <= FIT_TOTALX_MAX + MID_OFFSET) { - let sliceMidX = Math.round(startX + totalX / 2); - if (sliceMidX < midX - MID_OFFSET || sliceMidX > midX + MID_OFFSET) { - this.keyPressF(); - } else { - this.fillX(); - this.range.refresh = true; - this.notifyHandler(this.range); - this.range.refresh = false; - return; - } - } - this.range.startNS -= ((this.centerXPercentage * this.scale) / this.p) * this.currentDuration; - this.range.endNS += (((1 - this.centerXPercentage) * this.scale) / this.p) * this.currentDuration; - this.fillX(); - this.draw(); - this.range.refresh = false; - startX = Math.round((this.rulerW * (startTime - this.range.startNS)) / (this.range.endNS - this.range.startNS)); - endX = Math.round((this.rulerW * (endTime - this.range.startNS)) / (this.range.endNS - this.range.startNS)); - totalX = Math.round(endX - startX); - if (totalX <= FIT_TOTALX_MIN - MID_OFFSET) { - this.fillX(); - this.range.refresh = true; - this.notifyHandler(this.range); - this.range.refresh = false; - return; - } - this.pressFrameIdS = requestAnimationFrame(animS); - }; - if (Math.round(totalX) > FIT_TOTALX_MAX + MID_OFFSET) { - this.pressFrameIdS = requestAnimationFrame(animS); - } - if (totalX < FIT_TOTALX_MIN - MID_OFFSET) { - this.pressFrameIdW = requestAnimationFrame(animW); - } - } } diff --git a/ide/src/trace/database/ConvertTraceWorker.ts b/ide/src/trace/database/ConvertTraceWorker.ts index a4b49387..06d6644e 100644 --- a/ide/src/trace/database/ConvertTraceWorker.ts +++ b/ide/src/trace/database/ConvertTraceWorker.ts @@ -45,69 +45,20 @@ self.onmessage = async (e: MessageEvent) => { let fileData = e.data.buffer; const stepSize = 4 * 1024 * 1024; let totalSize = fileData.byteLength; - // 获取TraceConverter 实例 - let traceInsPtr = convertModule._GetTraceConverterIns(); - // 设置是否为debug模式 - convertModule._SetDebugFlag(false, traceInsPtr); - // 获取前8个字节,用来判断文件是htrace还是raw trace - let uint8Array = new Uint8Array(fileData.slice(0, 8)); + let traceInsPtr = convertModule._GetTraceConverterIns(); // 获取TraceConverter 实例 + convertModule._SetDebugFlag(false, traceInsPtr); // 设置是否为debug模式 + let uint8Array = new Uint8Array(fileData.slice(0, 8)); // 获取前8个字节,用来判断文件是htrace还是raw trace let enc = new TextDecoder(); let headerStr = enc.decode(uint8Array); let currentPosition = 1024; let dataHeader = convertModule._malloc(1100); let traceAllData = new Uint8Array(e.data.buffer); - if (headerStr.indexOf('OHOSPROF') == 0) { - // htrace - let uint8Array = new Uint8Array(fileData.slice(0, 1024)); - convertModule.HEAPU8.set(uint8Array, dataHeader); - convertModule._SendFileHeader(dataHeader, 1024, traceInsPtr); + if (headerStr.indexOf('OHOSPROF') === 0) { + handleHTrace(fileData, dataHeader, traceInsPtr); } else { - // raw trace - let uint8Array = new Uint8Array(fileData.slice(0, 12)); - convertModule.HEAPU8.set(uint8Array, dataHeader); - convertModule._SendRawFileHeader(dataHeader, 12, traceInsPtr); - currentPosition = 12; - // raw trace - let allRowTraceData = new Uint8Array(e.data.buffer); - let commonDataOffsetList: Array<{ - startOffset: number; - endOffset: number; - }> = []; - let commonOffset = 12; - let tlvTypeLength = 4; - let commonTotalLength = 0; - while (commonOffset < allRowTraceData.length) { - let commonDataOffset = { - startOffset: commonOffset, - endOffset: commonOffset, - }; - let dataTypeData = e.data.buffer.slice(commonOffset, commonOffset + tlvTypeLength); - commonOffset += tlvTypeLength; - let dataType = Array.from(new Uint32Array(dataTypeData)); - let currentLData = e.data.buffer.slice(commonOffset, commonOffset + tlvTypeLength); - commonOffset += tlvTypeLength; - let currentVLength = Array.from(new Uint32Array(currentLData)); - commonOffset += currentVLength[0]; - commonDataOffset.endOffset = commonOffset; - if (dataType[0] === 2 || dataType[0] === 3) { - commonTotalLength += commonDataOffset.endOffset - commonDataOffset.startOffset; - commonDataOffsetList.push(commonDataOffset); - } - } - let commonTotalOffset = 0; - let commonTotalData = new Uint8Array(commonTotalLength); - commonDataOffsetList.forEach((item) => { - commonTotalData.set(allRowTraceData.slice(item.startOffset, item.endOffset), commonTotalOffset); - commonTotalOffset += item.endOffset - item.startOffset; - }); - traceAllData = new Uint8Array(allRowTraceData.length + commonTotalData.length); - traceAllData.set(allRowTraceData.slice(0, currentPosition), 0); - traceAllData.set(commonTotalData, currentPosition); - traceAllData.set(allRowTraceData.slice(currentPosition), commonTotalData.length + currentPosition); - totalSize += commonTotalData.length; + handleRowTrace(e, fileData, dataHeader, traceInsPtr, currentPosition, traceAllData, totalSize); } let dataPtr = convertModule._malloc(stepSize); - // 申请分片内存 let arrayBufferPtr = convertModule._malloc(ARRAY_BUF_SIZE); convertModule._free(dataHeader); let bodyDataStr: string[] = []; @@ -119,37 +70,7 @@ self.onmessage = async (e: MessageEvent) => { }; let bodyFn = convertModule.addFunction(callback, 'vii'); convertModule._SetCallback(bodyFn, traceInsPtr); - while (currentPosition < totalSize) { - let endPosition = Math.min(currentPosition + stepSize, totalSize); - let currentChunk = new Uint8Array(traceAllData.slice(currentPosition, endPosition)); - convertModule.HEAPU8.set(currentChunk, dataPtr); - let leftLen = currentChunk.length; - let processedLen = 0; - let blockSize = 0; - let blockPtr = dataPtr; - while (leftLen > 0) { - if (leftLen > ARRAY_BUF_SIZE) { - blockSize = ARRAY_BUF_SIZE; - } else { - blockSize = leftLen; - } - let subArrayBuffer = convertModule.HEAPU8.subarray(blockPtr, blockPtr + blockSize); - convertModule.HEAPU8.set(subArrayBuffer, arrayBufferPtr); - // 调用分片转换接口 - if (headerStr.indexOf('OHOSPROF') == 0) { - // htrace - convertModule._ConvertBlockData(arrayBufferPtr, subArrayBuffer.length, traceInsPtr); - } else { - // raw trace - convertModule._ConvertRawBlockData(arrayBufferPtr, subArrayBuffer.length, traceInsPtr); - } - processedLen = processedLen + blockSize; - blockPtr = dataPtr + processedLen; - leftLen = currentChunk.length - processedLen; - } - currentPosition = endPosition; - } - + convertData(currentPosition, traceAllData, arrayBufferPtr, dataPtr, traceInsPtr, headerStr, stepSize, totalSize); convertModule._GetRemainingData(traceInsPtr); let headerData: string[] = []; let headerCallback = (heapPtr: number, size: number) => { @@ -161,21 +82,128 @@ self.onmessage = async (e: MessageEvent) => { let headerFn = convertModule.addFunction(headerCallback, 'vii'); convertModule._SetCallback(headerFn, traceInsPtr); convertModule._GetFinalHeader(traceInsPtr); - let allDataStr: string[] = []; - allDataStr = headerData.concat(bodyDataStr); + let allDataStr = headerData.concat(bodyDataStr); convertModule._ReleaseTraceConverterIns(traceInsPtr); // 释放TraceConverter 实例 convertModule._free(arrayBufferPtr); //释放分片内存 convertModule._free(dataPtr); - self.postMessage( - { - id: e.data.id, - action: 'convert', - status: true, - results: new Blob(allDataStr, { type: 'text/plain' }), - buffer: e.data.buffer, - }, - // @ts-ignore - [e.data.buffer!] - ); + postMessage(e, allDataStr); } }; +function handleHTrace(fileData: Array, dataHeader: any, traceInsPtr: any) { + let uint8Array = new Uint8Array(fileData.slice(0, 1024)); + convertModule.HEAPU8.set(uint8Array, dataHeader); + convertModule._SendFileHeader(dataHeader, 1024, traceInsPtr); +} +function handleRowTrace( + e: MessageEvent, + fileData: Array, + dataHeader: any, + traceInsPtr: any, + currentPosition: number, + traceAllData: Uint8Array, + totalSize: number +): void { + let uint8Array = new Uint8Array(fileData.slice(0, 12)); + convertModule.HEAPU8.set(uint8Array, dataHeader); + convertModule._SendRawFileHeader(dataHeader, 12, traceInsPtr); + currentPosition = 12; + let allRowTraceData = new Uint8Array(e.data.buffer); + let commonDataOffsetList: Array<{ + startOffset: number; + endOffset: number; + }> = []; + let commonTotalLength = 0; + setCommonDataOffsetList(e, allRowTraceData, commonTotalLength, commonDataOffsetList); + let commonTotalOffset = 0; + let commonTotalData = new Uint8Array(commonTotalLength); + commonDataOffsetList.forEach((item) => { + commonTotalData.set(allRowTraceData.slice(item.startOffset, item.endOffset), commonTotalOffset); + commonTotalOffset += item.endOffset - item.startOffset; + }); + traceAllData = new Uint8Array(allRowTraceData.length + commonTotalData.length); + traceAllData.set(allRowTraceData.slice(0, currentPosition), 0); + traceAllData.set(commonTotalData, currentPosition); + traceAllData.set(allRowTraceData.slice(currentPosition), commonTotalData.length + currentPosition); + totalSize += commonTotalData.length; +} +function setCommonDataOffsetList( + e: MessageEvent, + allRowTraceData: Uint8Array, + commonTotalLength: number, + commonDataOffsetList: Array +): void { + let commonOffset = 12; + let tlvTypeLength = 4; + while (commonOffset < allRowTraceData.length) { + let commonDataOffset = { + startOffset: commonOffset, + endOffset: commonOffset, + }; + let dataTypeData = e.data.buffer.slice(commonOffset, commonOffset + tlvTypeLength); + commonOffset += tlvTypeLength; + let dataType = Array.from(new Uint32Array(dataTypeData)); + let currentLData = e.data.buffer.slice(commonOffset, commonOffset + tlvTypeLength); + commonOffset += tlvTypeLength; + let currentVLength = Array.from(new Uint32Array(currentLData)); + commonOffset += currentVLength[0]; + commonDataOffset.endOffset = commonOffset; + if (dataType[0] === 2 || dataType[0] === 3) { + commonTotalLength += commonDataOffset.endOffset - commonDataOffset.startOffset; + commonDataOffsetList.push(commonDataOffset); + } + } +} +function convertData( + currentPosition: number, + traceAllData: Uint8Array, + arrayBufferPtr: any, + dataPtr: any, + traceInsPtr: any, + headerStr: string, + stepSize: number, + totalSize: number +): void { + while (currentPosition < totalSize) { + let endPosition = Math.min(currentPosition + stepSize, totalSize); + let currentChunk = new Uint8Array(traceAllData.slice(currentPosition, endPosition)); + convertModule.HEAPU8.set(currentChunk, dataPtr); + let leftLen = currentChunk.length; + let processedLen = 0; + let blockSize = 0; + let blockPtr = dataPtr; + while (leftLen > 0) { + if (leftLen > ARRAY_BUF_SIZE) { + blockSize = ARRAY_BUF_SIZE; + } else { + blockSize = leftLen; + } + let subArrayBuffer = convertModule.HEAPU8.subarray(blockPtr, blockPtr + blockSize); + convertModule.HEAPU8.set(subArrayBuffer, arrayBufferPtr); + // 调用分片转换接口 + if (headerStr.indexOf('OHOSPROF') === 0) { + // htrace + convertModule._ConvertBlockData(arrayBufferPtr, subArrayBuffer.length, traceInsPtr); + } else { + // raw trace + convertModule._ConvertRawBlockData(arrayBufferPtr, subArrayBuffer.length, traceInsPtr); + } + processedLen = processedLen + blockSize; + blockPtr = dataPtr + processedLen; + leftLen = currentChunk.length - processedLen; + } + currentPosition = endPosition; + } +} +function postMessage(e: MessageEvent, allDataStr: Array): void { + self.postMessage( + { + id: e.data.id, + action: 'convert', + status: true, + results: new Blob(allDataStr, { type: 'text/plain' }), + buffer: e.data.buffer, + }, + // @ts-ignore + [e.data.buffer!] + ); +} diff --git a/ide/src/trace/database/SqlLite.ts b/ide/src/trace/database/SqlLite.ts index 058d9546..d303c10a 100644 --- a/ide/src/trace/database/SqlLite.ts +++ b/ide/src/trace/database/SqlLite.ts @@ -200,59 +200,62 @@ export class DbPool { this.currentWasmThread = thread; thread!.worker!.onerror = (err) => { console.warn(err); - } + }; thread!.worker!.onmessageerror = (err) => { console.warn(err); - } - thread!.worker!.onmessage = (event: MessageEvent) => { - thread!.busy = false; - if (Reflect.has(thread!.taskMap, event.data.id)) { - if (event.data.results) { - let fun = thread!.taskMap[event.data.id]; - if (fun) { - fun(event.data.results, event.data.len, event.data.transfer,event.data.isEmpty); - } - Reflect.deleteProperty(thread!.taskMap, event.data.id); - } else if (Reflect.has(event.data, 'cutStatus')) { - let fun = thread!.taskMap[event.data.id]; - if (fun) { - fun(event.data); - } - } else if (Reflect.has(event.data, 'ready')) { - this.progress!('database opened', this.num + event.data.index); - this.progressTimer(this.num + event.data.index, this.progress!); - DbPool.sharedBuffer = null; - } else if (Reflect.has(event.data, 'init')) { - if (this.cutDownTimer != undefined) { - clearInterval(this.cutDownTimer); - } - let fun = thread!.taskMap[event.data.id]; - if (!event.data.init && !event.data.status) { - if (fun) { - fun(['error', event.data.msg]); - } - } else { - this.progress!('database ready', 40); - if (fun) { - fun(event.data); - } - } - Reflect.deleteProperty(thread!.taskMap, event.data.id); - } else { - let fun = thread!.taskMap[event.data.id]; - if (fun) { - fun([]); - } - Reflect.deleteProperty(thread!.taskMap, event.data.id); - } - } }; + this.threadPostMessage(thread); thread!.id = i; thread!.busy = false; this.works?.push(thread!); } } }; + threadPostMessage(thread: DbThread) { + thread!.worker!.onmessage = (event: MessageEvent) => { + thread!.busy = false; + if (Reflect.has(thread!.taskMap, event.data.id)) { + if (event.data.results) { + let fun = thread!.taskMap[event.data.id]; + if (fun) { + fun(event.data.results, event.data.len, event.data.transfer, event.data.isEmpty); + } + Reflect.deleteProperty(thread!.taskMap, event.data.id); + } else if (Reflect.has(event.data, 'cutStatus')) { + let fun = thread!.taskMap[event.data.id]; + if (fun) { + fun(event.data); + } + } else if (Reflect.has(event.data, 'ready')) { + this.progress!('database opened', this.num + event.data.index); + this.progressTimer(this.num + event.data.index, this.progress!); + DbPool.sharedBuffer = null; + } else if (Reflect.has(event.data, 'init')) { + if (this.cutDownTimer != undefined) { + clearInterval(this.cutDownTimer); + } + let fun = thread!.taskMap[event.data.id]; + if (!event.data.init && !event.data.status) { + if (fun) { + fun(['error', event.data.msg]); + } + } else { + this.progress!('database ready', 40); + if (fun) { + fun(event.data); + } + } + Reflect.deleteProperty(thread!.taskMap, event.data.id); + } else { + let fun = thread!.taskMap[event.data.id]; + if (fun) { + fun([]); + } + Reflect.deleteProperty(thread!.taskMap, event.data.id); + } + } + }; + } initServer = async (url: string, progress: Function): Promise<{ status: boolean; msg: string }> => { this.progress = progress; @@ -299,13 +302,15 @@ export class DbPool { let headers = new Headers(); headers.append('Content-Length', `${buffer.byteLength}`); headers.append('Content-Type', 'application/octet-stream'); - cache.put( - key, - new Response(buffer, { - status: 200, - headers: headers, - }) - ).then(); + cache + .put( + key, + new Response(buffer, { + status: 200, + headers: headers, + }) + ) + .then(); }); } @@ -324,7 +329,7 @@ export class DbPool { let splitB = keyB.split('/'); let timeA = splitA[splitA.length - 1].split('-')[0]; let timeB = splitB[splitB.length - 1].split('-')[0]; - return parseInt(timeA) - parseInt(timeB) + return parseInt(timeA) - parseInt(timeB); } else { return 0; } @@ -414,12 +419,7 @@ export class DbPool { export const threadPool = new DbPool(); -export function query( - name: string, - sql: string, - args: any = null, - action: string | null = null -): Promise> { +export function query(name: string, sql: string, args: any = null, action: string | null = null): Promise> { return new Promise>((resolve, reject) => { threadPool.submit( name, diff --git a/ide/src/trace/database/data-trafic/FrameJanksReceiver.ts b/ide/src/trace/database/data-trafic/FrameJanksReceiver.ts index 91a89074..116ccc28 100644 --- a/ide/src/trace/database/data-trafic/FrameJanksReceiver.ts +++ b/ide/src/trace/database/data-trafic/FrameJanksReceiver.ts @@ -46,6 +46,10 @@ export const frameJankDataSql = (args: any, configure: any): string => { default: break; } + let sql = setFrameJanksSql(args, timeLimit, flag, fsType, fsFlag); + return sql; +}; +function setFrameJanksSql(args: any, timeLimit: string, flag: string, fsType: number, fsFlag: string): string { return `SELECT sf.id, 'frameTime' as frameType, fs.ipid, @@ -69,8 +73,7 @@ export const frameJankDataSql = (args: any, configure: any): string => { LEFT JOIN process AS proc ON proc.id = sf.ipid WHERE fs.dst IS NOT NULL AND fs.type = ${fsType} - ${fsFlag} - ${timeLimit} + ${fsFlag} ${timeLimit} UNION SELECT -1 as id, 'frameTime' as frameType, @@ -88,11 +91,9 @@ export const frameJankDataSql = (args: any, configure: any): string => { WHERE fs.dst IS NULL AND pro.name NOT LIKE '%render_service%' AND fs.type = 1 - ${fsFlag} - ${timeLimit} + ${fsFlag} ${timeLimit} ORDER by ts`; -}; - +} let frameDepthList: Map = new Map(); export function frameExpectedReceiver(data: any, proc: Function): void { diff --git a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerFileSystem.ts b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerFileSystem.ts index a8578116..3d820824 100644 --- a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerFileSystem.ts +++ b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerFileSystem.ts @@ -578,20 +578,15 @@ export class ProcedureLogicWorkerFileSystem extends LogicHandler { break; } lastCallChain = callChainList[depth]; - if (type === BIO_TYPE) { - let symbolName = this.dataCache.dataDict?.get(lastCallChain.symbolsId); - if (symbolName?.includes('submit_bio')) { - depth--; - } else { - break; - } + let symbolName = this.dataCache.dataDict?.get(lastCallChain.symbolsId); + let libPath = this.dataCache.dataDict?.get(lastCallChain.pathId); + if ( + (type === BIO_TYPE && symbolName?.includes('submit_bio')) || + (type !== BIO_TYPE && libPath && (libPath.includes('musl') || libPath.includes('libc++'))) + ) { + depth--; } else { - let libPath = this.dataCache.dataDict?.get(lastCallChain.pathId); - if (libPath?.includes('musl') || libPath?.includes('libc++')) { - depth--; - } else { - break; - } + break; } } if (!lastCallChain) { diff --git a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerPerf.ts b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerPerf.ts index 9511e515..f8186bb9 100644 --- a/ide/src/trace/database/logic-worker/ProcedureLogicWorkerPerf.ts +++ b/ide/src/trace/database/logic-worker/ProcedureLogicWorkerPerf.ts @@ -165,8 +165,8 @@ export class ProcedureLogicWorkerPerf extends LogicHandler { if (funFilter.length !== 0) { this.setSymbol(funFilter); } - let result = this.calReturnData(data.params); if (filter.length === 0) { + let result = this.calReturnData(data.params); self.postMessage({ id: data.id, action: data.action, diff --git a/ide/src/trace/database/ui-worker/ProcedureWorker.ts b/ide/src/trace/database/ui-worker/ProcedureWorker.ts index 775c09c6..c279965c 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorker.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorker.ts @@ -154,7 +154,26 @@ let convertJSON = (arr: any): any => { return arr; } }; + self.onmessage = (e: any): void => { + clear(e); + if (e.data.params && e.data.params.list) { + dataList[e.data.type] = convertJSON(e.data.params.list); + if (e.data.params.offscreen) { + canvasList[e.data.type] = e.data.params.offscreen; + contextList[e.data.type] = e.data.params.offscreen!.getContext('2d'); + contextList[e.data.type].scale(e.data.params.dpr, e.data.params.dpr); + } + } + if (!dataFilter[e.data.type]) { + dataFilter[e.data.type] = []; + } + let req = new RequestMessage(); + setReq(req, e); + + match(req.type!, req); +}; +function clear(e: any) { if (e.data.type && (e.data.type as string).startsWith('clear')) { dataList = {}; dataList2 = {}; @@ -169,18 +188,8 @@ self.onmessage = (e: any): void => { }); return; } - if (e.data.params && e.data.params.list) { - dataList[e.data.type] = convertJSON(e.data.params.list); - if (e.data.params.offscreen) { - canvasList[e.data.type] = e.data.params.offscreen; - contextList[e.data.type] = e.data.params.offscreen!.getContext('2d'); - contextList[e.data.type].scale(e.data.params.dpr, e.data.params.dpr); - } - } - if (!dataFilter[e.data.type]) { - dataFilter[e.data.type] = []; - } - let req = new RequestMessage(); +} +function setReq(req: RequestMessage, e: any) { req.canvas = canvasList[e.data.type]; req.context = contextList[e.data.type]; req.type = e.data.type as string; @@ -210,7 +219,6 @@ self.onmessage = (e: any): void => { req.wakeupBean = e.data.params.wakeupBean; req.intervalPerf = e.data.params.intervalPerf; } - req.id = e.data.id; if (!req.frame) { info(req.frame); @@ -223,6 +231,5 @@ self.onmessage = (e: any): void => { req.context.scale(e.data.params.dpr, e.data.params.dpr); } } - match(req.type, req); -}; +} self.onmessageerror = function (e: any): void {}; diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerAppStartup.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerAppStartup.ts index 3d6374a2..e88380a7 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerAppStartup.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerAppStartup.ts @@ -16,6 +16,7 @@ import { BaseStruct, dataFilterHandler, drawString } from './ProcedureWorkerCommon'; import { TraceRow } from '../../component/trace/base/TraceRow'; import { ColorUtils } from '../../component/trace/base/ColorUtils'; +import {SpSystemTrace} from "../../component/SpSystemTrace"; export class AppStartupRender { renderMainThread( @@ -61,7 +62,18 @@ export class AppStartupRender { } const padding = 3; - +export function AppStartupStructOnClick(clickRowType: string, sp: SpSystemTrace,scrollToFuncHandler:any) { + return new Promise((resolve,reject) => { + if (clickRowType === TraceRow.ROW_TYPE_APP_STARTUP && AppStartupStruct.hoverStartupStruct) { + AppStartupStruct.selectStartupStruct = AppStartupStruct.hoverStartupStruct; + sp.traceSheetEL?.displayStartupData(AppStartupStruct.selectStartupStruct, scrollToFuncHandler); + sp.timerShaftEL?.modifyFlagList(undefined); + reject(); + }else{ + resolve(null); + } + }); +} export class AppStartupStruct extends BaseStruct { static hoverStartupStruct: AppStartupStruct | undefined; static selectStartupStruct: AppStartupStruct | undefined; diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerClock.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerClock.ts index 97a4e766..69c055e1 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerClock.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerClock.ts @@ -16,6 +16,7 @@ import { BaseStruct, dataFilterHandler, drawLoadingFrame, isFrameContainPoint, Render } from './ProcedureWorkerCommon'; import { TraceRow } from '../../component/trace/base/TraceRow'; import { ColorUtils } from '../../component/trace/base/ColorUtils'; +import {SpSystemTrace} from "../../component/SpSystemTrace"; export class ClockRender extends Render { renderMainThread( @@ -65,7 +66,19 @@ export class ClockRender extends Render { clockReq.context.fillText(s, 4, 5 + 9); } } +export function ClockStructOnClick(clickRowType: string, sp: SpSystemTrace) { + return new Promise((resolve, reject) => { + if (clickRowType === TraceRow.ROW_TYPE_CLOCK && ClockStruct.hoverClockStruct) { + ClockStruct.selectClockStruct = ClockStruct.hoverClockStruct; + sp.traceSheetEL?.displayClockData(ClockStruct.selectClockStruct); + sp.timerShaftEL?.modifyFlagList(undefined); + reject(); + }else{ + resolve(null); + } + }); +} export class ClockStruct extends BaseStruct { static maxValue: number = 0; static maxName: string = ''; diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerCommon.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerCommon.ts index 56041dc5..066ff349 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerCommon.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerCommon.ts @@ -18,6 +18,7 @@ import { TraceRow } from '../../component/trace/base/TraceRow'; import { TimerShaftElement } from '../../component/trace/TimerShaftElement'; import { Flag } from '../../component/trace/timer-shaft/Flag'; import { drawVSync } from '../../component/chart/VSync'; +import { draw } from '../../bean/FrameChartStruct'; export abstract class Render { abstract renderMainThread(req: any, row: TraceRow): void; @@ -281,23 +282,44 @@ export const dataFilterHandler = (fullData: Array, filterData: Array, let y = condition.frame.y + condition.paddingTop; let height = condition.frame.height - condition.paddingTop * 2; let slice = findRange(fullData, condition); - let sum = 0; for (let i = 0; i < slice.length; i++) { if (!slice[i].frame) { slice[i].frame = {}; slice[i].frame.y = y; slice[i].frame.height = height; } - if (i === slice.length - 1) { - if (slice[i][condition.durKey] === undefined || slice[i][condition.durKey] === null) { + if (slice[i][condition.durKey] === undefined || slice[i][condition.durKey] === null) { + if (i === slice.length - 1) { slice[i][condition.durKey] = (condition.endNS || 0) - (slice[i][condition.startKey] || 0); - } - } else { - if (slice[i][condition.durKey] === undefined || slice[i][condition.durKey] === null) { + } else { slice[i][condition.durKey] = (slice[i + 1][condition.startKey] || 0) - (slice[i][condition.startKey] || 0); } } - if (slice[i][condition.durKey] >= pns || slice.length < 100) { + setSliceFrame(slice, condition, pns, i); + } + filterData.push(...slice.filter((it) => it.v)); + } +}; +function setSliceFrame(slice: Array, condition: FilterConfig, pns: number, i: number) { + let sum = 0; + if (slice[i][condition.durKey] >= pns || slice.length < 100) { + slice[i].v = true; + setNodeFrame( + slice[i], + pns, + condition.startNS, + condition.endNS, + condition.frame, + condition.startKey, + condition.durKey + ); + } else { + if (i > 0) { + let c = slice[i][condition.startKey] - slice[i - 1][condition.startKey] - slice[i - 1][condition.durKey]; + if (c < pns && sum < pns) { + sum += c + slice[i - 1][condition.durKey]; + slice[i].v = false; + } else { slice[i].v = true; setNodeFrame( slice[i], @@ -308,32 +330,11 @@ export const dataFilterHandler = (fullData: Array, filterData: Array, condition.startKey, condition.durKey ); - } else { - if (i > 0) { - let c = slice[i][condition.startKey] - slice[i - 1][condition.startKey] - slice[i - 1][condition.durKey]; - if (c < pns && sum < pns) { - sum += c + slice[i - 1][condition.durKey]; - slice[i].v = false; - } else { - slice[i].v = true; - setNodeFrame( - slice[i], - pns, - condition.startNS, - condition.endNS, - condition.frame, - condition.startKey, - condition.durKey - ); - sum = 0; - } - } + sum = 0; } } - filterData.push(...slice.filter((it) => it.v)); } -}; - +} function setNodeFrame( node: any, pns: number, @@ -897,8 +898,6 @@ function drawAvgFrameRate( ): void { let avgFrameRate: string = calculateAvgRate(arrList) + 'fps'; const textWidth = ctx.measureText(avgFrameRate).width; - const textHeight = 25; - const padding = 5; const TEXT_WIDTH_HALF = 2; let textX = Math.floor( @@ -931,6 +930,19 @@ function drawAvgFrameRate( if (endX >= selectParams.frame.width) { endX = selectParams.frame.width + ADD_DISTANCE; } + drawAvgFrameRateArrow(ctx, textX, textY, textWidth, startX, endX, avgFrameRate); +} +function drawAvgFrameRateArrow( + ctx: any, + textX: number, + textY: number, + textWidth: number, + startX: number, + endX: number, + avgFrameRate: string +) { + const textHeight = 25; + const padding = 5; const TEXT_RECT_PADDING = 2; ctx.fillStyle = 'red'; ctx.fillRect( @@ -945,23 +957,23 @@ function drawAvgFrameRate( ctx.moveTo(startX, textY); ctx.lineTo(endX, textY); ctx.stroke(); - const arrowSize = 5.5; - const arrowHead = (x: number, y: number, direction: 'left' | 'right') => { - ctx.beginPath(); - const headX = x + (direction === 'left' ? arrowSize : -arrowSize); - const headY = y - arrowSize / 2; - ctx.moveTo(x, y); - ctx.lineTo(headX, headY); - ctx.lineTo(headX, y + arrowSize); - ctx.closePath(); - ctx.fillStyle = 'yellow'; - ctx.fill(); - }; - arrowHead(startX, textY - 1, 'left'); - arrowHead(endX, textY - 1, 'right'); + arrowHead(ctx, startX, textY - 1, 'left'); + arrowHead(ctx, endX, textY - 1, 'right'); ctx.fillStyle = 'white'; ctx.fillText(avgFrameRate, textX, textY - 8); } +const arrowSize = 5.5; +const arrowHead = (ctx: any, x: number, y: number, direction: 'left' | 'right') => { + ctx.beginPath(); + const headX = x + (direction === 'left' ? arrowSize : -arrowSize); + const headY = y - arrowSize / 2; + ctx.moveTo(x, y); + ctx.lineTo(headX, headY); + ctx.lineTo(headX, y + arrowSize); + ctx.closePath(); + ctx.fillStyle = 'yellow'; + ctx.fill(); +}; export function drawWakeUp( wakeUpContext: CanvasRenderingContext2D | any, @@ -1499,18 +1511,16 @@ function setFrameByArr( function setResultArr(groupBy10MS: boolean, list: Array, i: number, res: Array) { if (groupBy10MS) { - if ( + let flag: boolean = i > 0 && - (list[i - 1].frame?.x || 0) === (list[i].frame?.x || 0) && - (list[i - 1].frame?.width || 0) === (list[i].frame?.width || 0) && - (list[i - 1].frame?.height || 0) === (list[i].frame?.height || 0) - ) { - } else { + (list[i - 1].frame.x || 0) === (list[i].frame.x || 0) && + (list[i - 1].frame.width || 0) === (list[i].frame.width || 0) && + (list[i - 1].frame.height || 0) === (list[i].frame.height || 0); + if (!flag) { res.push(list[i]); } } else { - if (i > 0 && Math.abs((list[i - 1].frame?.x || 0) - (list[i].frame?.x || 0)) < 4) { - } else { + if (!(i > 0 && Math.abs((list[i - 1].frame.x || 0) - (list[i].frame.x || 0)) < 4)) { res.push(list[i]); } } diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerCpuProfiler.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerCpuProfiler.ts index 0a79f0df..a2637f51 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerCpuProfiler.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerCpuProfiler.ts @@ -25,6 +25,7 @@ import { import { TraceRow } from '../../component/trace/base/TraceRow'; import { ColorUtils } from '../../component/trace/base/ColorUtils'; import { type JsCpuProfilerChartFrame } from '../../bean/JsStruct'; +import {SpSystemTrace} from "../../component/SpSystemTrace"; export class JsCpuProfilerRender extends Render { renderMainThread( @@ -102,11 +103,88 @@ export function jsCpuProfiler( filter[i].frame = null; } } - return; } } const padding = 1; +export function JsCpuProfilerStructOnClick(clickRowType: string, sp: SpSystemTrace) { + return new Promise((resolve, reject) => { + if (clickRowType === TraceRow.ROW_TYPE_JS_CPU_PROFILER && JsCpuProfilerStruct.hoverJsCpuProfilerStruct) { + JsCpuProfilerStruct.selectJsCpuProfilerStruct = JsCpuProfilerStruct.hoverJsCpuProfilerStruct; + let selectStruct = JsCpuProfilerStruct.selectJsCpuProfilerStruct; + let dataArr: Array = []; + let parentIdArr: Array = []; + let that = sp; + getTopJsCpuProfilerStruct(selectStruct.parentId); + + function getTopJsCpuProfilerStruct(parentId: number) { + if (parentId === -1 && selectStruct.parentId === -1) { + // 点击的函数是第一层,直接设置其children的isSelect为true,不用重新算totalTime + let data = that.chartManager!.arkTsChart.chartFrameMap.get(selectStruct!.id); + if (data && dataArr.length === 0) { + let copyData = JSON.parse(JSON.stringify(data)); + setSelectChildrenState(copyData); + dataArr.push(copyData); + } + } else { + let parent = that.chartManager!.arkTsChart.chartFrameMap.get(parentId); + if (parent) { + parentIdArr.push(parent.id); + getTopJsCpuProfilerStruct(parent.parentId!); + if (parent.parentId === -1 && dataArr.length === 0) { + let data = that.chartManager!.arkTsChart.chartFrameMap.get(parent.id); + let copyParent = JSON.parse(JSON.stringify(data)); + copyParent.totalTime = selectStruct.totalTime; + copyParent.selfTime = 0; + // depth为0的isSelect改为true + copyParent.isSelect = true; + if (copyParent.children.length > 0) { + getSelectStruct(copyParent); + } + dataArr.push(copyParent); + } + } + } + } + + function getSelectStruct(data: JsCpuProfilerChartFrame) { + for (let child of data.children) { + if (child === null) { + continue; + } + if (child.id === selectStruct!.id) { + // 将点击的函数的children的isSelect改为true + setSelectChildrenState(child); + } else { + getSelectStruct(child); + } + if (parentIdArr.includes(child.id)) { + child.isSelect = true; + child.totalTime = selectStruct.totalTime; + child.selfTime = 0; + } + } + } + + function setSelectChildrenState(data: JsCpuProfilerChartFrame) { + data.isSelect = true; + if (data.children.length > 0) { + for (let child of data.children) { + if (child === null) { + continue; + } + setSelectChildrenState(child); + } + } + } + that.traceSheetEL?.displayJsProfilerData(dataArr); + reject(); + }else{ + resolve(null); + } + }); + +} export class JsCpuProfilerStruct extends BaseStruct { static lastSelectJsCpuProfilerStruct: JsCpuProfilerStruct | undefined; static selectJsCpuProfilerStruct: JsCpuProfilerStruct | undefined; diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerDiskIoAbility.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerDiskIoAbility.ts index c647b2c3..2b4f188b 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerDiskIoAbility.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerDiskIoAbility.ts @@ -113,19 +113,19 @@ function setDiskIoAbilityFilter( if (diskIoAbilityList) { for (let index = 0; index < diskIoAbilityList.length; index++) { let item = diskIoAbilityList[index]; - if (index === diskIoAbilityList.length - 1) { - item.dur = endNS - (item.startNS || 0); - } else { - item.dur = (diskIoAbilityList[index + 1].startNS || 0) - (item.startNS || 0); - } + item.dur = + index === diskIoAbilityList.length - 1 + ? endNS - (item.startNS || 0) + : (diskIoAbilityList[index + 1].startNS || 0) - (item.startNS || 0); if ((item.startNS || 0) + (item.dur || 0) > startNS && (item.startNS || 0) < endNS) { DiskAbilityMonitorStruct.setDiskIOFrame(diskIoAbilityList[index], 5, startNS, endNS, totalNS, frame); if ( - index > 0 && - (diskIoAbilityList[index - 1].frame?.x || 0) == (diskIoAbilityList[index].frame?.x || 0) && - (diskIoAbilityList[index - 1].frame?.width || 0) == (diskIoAbilityList[index].frame?.width || 0) + !( + index > 0 && + (diskIoAbilityList[index - 1].frame.x || 0) === (diskIoAbilityList[index].frame.x || 0) && + (diskIoAbilityList[index - 1].frame.width || 0) === (diskIoAbilityList[index].frame.width || 0) + ) ) { - } else { res.push(item); } } diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerEnergyPower.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerEnergyPower.ts index 4bce0ec8..005e1b6d 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerEnergyPower.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerEnergyPower.ts @@ -115,36 +115,38 @@ export function power( for (let index = 0; index < res.length; index++) { let item = res[index]; let obj = item[appName]; - if (obj != undefined) { - if (obj.ts + 1000000000 > (startNS || 0) && (obj.ts || 0) < (endNS || 0)) { - firstData.push(obj); - } + if (obj != undefined && obj.ts + 1000000000 > (startNS || 0) && (obj.ts || 0) < (endNS || 0)) { + firstData.push(obj); } } let array = firstData.sort((a, b) => a.ts - b.ts); - array.forEach((item) => { - if (list.length > 0) { - if (item.ts + 500000000 >= list[list.length - 1].ts && item.ts - 500000000 <= list[list.length - 1].ts) { - list[list.length - 1].cpu = item.cpu === 0 ? list[list.length - 1].cpu : item.cpu; - list[list.length - 1].location = item.location === 0 ? list[list.length - 1].location : item.location; - list[list.length - 1].gpu = item.gpu === 0 ? list[list.length - 1].gpu : item.gpu; - list[list.length - 1].display = item.display === 0 ? list[list.length - 1].display : item.display; - list[list.length - 1].camera = item.camera === 0 ? list[list.length - 1].camera : item.camera; - list[list.length - 1].bluetooth = item.bluetooth === 0 ? list[list.length - 1].bluetooth : item.bluetooth; - list[list.length - 1].flashlight = item.flashlight === 0 ? list[list.length - 1].flashlight : item.flashlight; - list[list.length - 1].audio = item.audio === 0 ? list[list.length - 1].audio : item.audio; - list[list.length - 1].wifiscan = item.wifiscan === 0 ? list[list.length - 1].wifiscan : item.wifiscan; - } else { - list.push(item); - } - } else { - list.push(item); - } - }); + setFirstDataArray(array, list); computeMaxPower(array, list, startNS, endNS, totalNS, frame); } } +function setFirstDataArray(array: any[], list: Array): void { + array.forEach((item) => { + if ( + list.length > 0 && + item.ts + 500000000 >= list[list.length - 1].ts && + item.ts - 500000000 <= list[list.length - 1].ts + ) { + list[list.length - 1].cpu = item.cpu === 0 ? list[list.length - 1].cpu : item.cpu; + list[list.length - 1].location = item.location === 0 ? list[list.length - 1].location : item.location; + list[list.length - 1].gpu = item.gpu === 0 ? list[list.length - 1].gpu : item.gpu; + list[list.length - 1].display = item.display === 0 ? list[list.length - 1].display : item.display; + list[list.length - 1].camera = item.camera === 0 ? list[list.length - 1].camera : item.camera; + list[list.length - 1].bluetooth = item.bluetooth === 0 ? list[list.length - 1].bluetooth : item.bluetooth; + list[list.length - 1].flashlight = item.flashlight === 0 ? list[list.length - 1].flashlight : item.flashlight; + list[list.length - 1].audio = item.audio === 0 ? list[list.length - 1].audio : item.audio; + list[list.length - 1].wifiscan = item.wifiscan === 0 ? list[list.length - 1].wifiscan : item.wifiscan; + } else { + list.push(item); + } + }); +} + function computeMaxPower( array: Array, list: Array, diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerEnergyState.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerEnergyState.ts index a87f3f6c..0e30f5f4 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerEnergyState.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerEnergyState.ts @@ -101,19 +101,19 @@ function stateFilter( if (stateList) { for (let index = 0; index < stateList.length; index++) { let item = stateList[index]; - if (index === stateList.length - 1) { - item.dur = endNS - (item.startNs || 0); - } else { - item.dur = (stateList[index + 1].startNs || 0) - (item.startNs || 0); - } + item.dur = + index === stateList.length - 1 + ? endNS - (item.startNs || 0) + : (stateList[index + 1].startNs || 0) - (item.startNs || 0); if ((item.startNs || 0) + (item.dur || 0) > startNS && (item.startNs || 0) < endNS) { EnergyStateStruct.setStateFrame(stateList[index], 5, startNS, endNS, totalNS, frame); if ( - index > 0 && - (stateList[index - 1].frame?.x || 0) == (stateList[index].frame?.x || 0) && - (stateList[index - 1].frame?.width || 0) == (stateList[index].frame?.width || 0) + !( + index > 0 && + (stateList[index - 1].frame?.x || 0) == (stateList[index].frame?.x || 0) && + (stateList[index - 1].frame?.width || 0) == (stateList[index].frame?.width || 0) + ) ) { - } else { res.push(item); } } diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerFrameAnimation.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerFrameAnimation.ts index 987e2aab..0752a7aa 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerFrameAnimation.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerFrameAnimation.ts @@ -24,6 +24,7 @@ import { Rect, Render, } from './ProcedureWorkerCommon'; +import {SpSystemTrace} from "../../component/SpSystemTrace"; export class FrameAnimationRender extends Render { renderMainThread( @@ -105,7 +106,18 @@ export class FrameAnimationRender extends Render { } } } - +export function FrameAnimationStructOnClick(clickRowType: string, sp: SpSystemTrace) { + return new Promise((resolve,reject) => { + if (clickRowType === TraceRow.ROW_TYPE_FRAME_ANIMATION && FrameAnimationStruct.hoverFrameAnimationStruct) { + FrameAnimationStruct.selectFrameAnimationStruct = FrameAnimationStruct.hoverFrameAnimationStruct; + sp.traceSheetEL?.displayFrameAnimationData(FrameAnimationStruct.selectFrameAnimationStruct); + sp.timerShaftEL?.modifyFlagList(undefined); + reject(); + }else{ + resolve(null); + } + }); +} export class FrameAnimationStruct extends BaseStruct { static hoverFrameAnimationStruct: FrameAnimationStruct | undefined; static selectFrameAnimationStruct: FrameAnimationStruct | undefined; diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerFrameDynamic.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerFrameDynamic.ts index 8c1553fb..baeb077d 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerFrameDynamic.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerFrameDynamic.ts @@ -25,6 +25,7 @@ import { } from './ProcedureWorkerCommon'; import { type AnimationRanges } from '../../bean/FrameComponentBean'; import { ColorUtils } from '../../component/trace/base/ColorUtils'; +import {SpSystemTrace} from "../../component/SpSystemTrace"; export class FrameDynamicRender extends Render { renderMainThread( @@ -284,7 +285,18 @@ export class FrameDynamicRender extends Render { FrameDynamicStruct.setFrameDynamic(currentFrameDynamic, startNS, endNS, totalNS, frame); } } - +export function FrameDynamicStructOnClick(clickRowType: string, sp: SpSystemTrace, row: undefined | TraceRow) { + return new Promise((resolve,reject) => { + if (clickRowType === TraceRow.ROW_TYPE_FRAME_DYNAMIC && FrameDynamicStruct.hoverFrameDynamicStruct) { + FrameDynamicStruct.selectFrameDynamicStruct = FrameDynamicStruct.hoverFrameDynamicStruct; + sp.traceSheetEL?.displayFrameDynamicData(row!, FrameDynamicStruct.selectFrameDynamicStruct); + sp.timerShaftEL?.modifyFlagList(undefined); + reject(); + }else{ + resolve(null); + } + }); +} export class FrameDynamicStruct extends BaseStruct { static hoverFrameDynamicStruct: FrameDynamicStruct | undefined; static selectFrameDynamicStruct: FrameDynamicStruct | undefined; diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerFrameSpacing.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerFrameSpacing.ts index 3a38528d..62323fed 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerFrameSpacing.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerFrameSpacing.ts @@ -25,6 +25,7 @@ import { } from './ProcedureWorkerCommon'; import { type AnimationRanges } from '../../bean/FrameComponentBean'; import { ColorUtils } from '../../component/trace/base/ColorUtils'; +import {SpSystemTrace} from "../../component/SpSystemTrace"; export class FrameSpacingRender extends Render { renderMainThread( @@ -297,7 +298,18 @@ export class FrameSpacingRender extends Render { return [min, max]; } } - +export function FrameSpacingStructOnClick(clickRowType: string, sp: SpSystemTrace) { + return new Promise((resolve,reject) => { + if (clickRowType === TraceRow.ROW_TYPE_FRAME_SPACING && FrameSpacingStruct.hoverFrameSpacingStruct) { + FrameSpacingStruct.selectFrameSpacingStruct = FrameSpacingStruct.hoverFrameSpacingStruct; + sp.traceSheetEL?.displayFrameSpacingData(FrameSpacingStruct.selectFrameSpacingStruct); + sp.timerShaftEL?.modifyFlagList(undefined); + reject(); + }else{ + resolve(null); + } + }); +} export class FrameSpacingStruct extends BaseStruct { static hoverFrameSpacingStruct: FrameSpacingStruct | undefined; static selectFrameSpacingStruct: FrameSpacingStruct | undefined; diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerFreq.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerFreq.ts index 800e4163..6f7526e4 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerFreq.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerFreq.ts @@ -23,6 +23,7 @@ import { RequestMessage, } from './ProcedureWorkerCommon'; import { TraceRow } from '../../component/trace/base/TraceRow'; +import {SpSystemTrace} from "../../component/SpSystemTrace"; export class FreqRender extends Render { renderMainThread( @@ -68,7 +69,18 @@ export class FreqRender extends Render { freqReq.context.fillText(s, 4, 5 + 9); } } - +export function CpuFreqStructOnClick(clickRowType: string, sp: SpSystemTrace) { + return new Promise((resolve, reject) => { + if (clickRowType === TraceRow.ROW_TYPE_CPU_FREQ && CpuFreqStruct.hoverCpuFreqStruct) { + CpuFreqStruct.selectCpuFreqStruct = CpuFreqStruct.hoverCpuFreqStruct; + sp.traceSheetEL?.displayFreqData(); + sp.timerShaftEL?.modifyFlagList(undefined); + reject(); + }else{ + resolve(null); + } + }); +} export class CpuFreqStruct extends BaseStruct { static maxFreq: number = 0; static maxFreqName: string = '0 GHz'; diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerFunc.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerFunc.ts index 7d6f7ef2..0136fbd4 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerFunc.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerFunc.ts @@ -27,6 +27,7 @@ import { } from './ProcedureWorkerCommon'; import { FuncStruct as BaseFuncStruct } from '../../bean/FuncStruct'; import { FlagsConfig } from '../../component/SpFlags'; +import {TabPaneTaskFrames} from "../../component/trace/sheet/task/TabPaneTaskFrames"; export class FuncRender extends Render { renderMainThread( req: { @@ -123,7 +124,33 @@ export function func( }); } } - +export function FuncStructOnClick(clickRowType: string, sp:any,row:TraceRow|undefined, scrollToFuncHandler: any) { + return new Promise((resolve, reject) => { + if (clickRowType === TraceRow.ROW_TYPE_FUNC && FuncStruct.hoverFuncStruct) { + TabPaneTaskFrames.TaskArray = []; + sp.removeLinkLinesByBusinessType('task'); + FuncStruct.selectFuncStruct = FuncStruct.hoverFuncStruct; + let hoverFuncStruct = FuncStruct.hoverFuncStruct; + sp.timerShaftEL?.drawTriangle(FuncStruct.selectFuncStruct!.startTs || 0, 'inverted'); + FuncStruct.selectFuncStruct = hoverFuncStruct; + let flagConfig = FlagsConfig.getFlagsConfig('TaskPool'); + let showTabArray: Array = ['current-selection']; + if (flagConfig!.TaskPool === 'Enabled') { + if (FuncStruct.selectFuncStruct?.funName) { + if (FuncStruct.selectFuncStruct.funName.indexOf('H:Task ') >= 0) { + showTabArray.push('box-task-frames'); + sp.drawTaskPollLine(row); + } + } + } + sp.traceSheetEL?.displayFuncData(showTabArray, FuncStruct.selectFuncStruct, scrollToFuncHandler); + sp.timerShaftEL?.modifyFlagList(undefined); + reject(); + } else { + resolve(null); + } + }); +} export class FuncStruct extends BaseFuncStruct { static hoverFuncStruct: FuncStruct | undefined; static selectFuncStruct: FuncStruct | undefined; diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerHeap.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerHeap.ts index 3b9ff146..1a3c0cfb 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerHeap.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerHeap.ts @@ -16,6 +16,7 @@ import { Rect, Render, isFrameContainPoint, ns2x, drawLoadingFrame } from './ProcedureWorkerCommon'; import { TraceRow } from '../../component/trace/base/TraceRow'; import { HeapStruct as BaseHeapStruct } from '../../bean/HeapStruct'; +import {SpSystemTrace} from "../../component/SpSystemTrace"; export class NativeMemoryRender extends Render { renderMainThread(req: any, row: TraceRow) {} } @@ -40,33 +41,50 @@ export class HeapRender { req.useCache || (TraceRow.range?.refresh ?? false) ); drawLoadingFrame(req.context, heapFilter, row); - // 多条数据,最后一条数据在结束点也需要绘制 - if (heapFilter.length >= 2 && heapFilter[heapFilter.length - 1].dur === 0) { - if (heapFilter[heapFilter.length - 2].frame && heapFilter[heapFilter.length - 1].frame) { - heapFilter[heapFilter.length - 2].frame!.width = heapFilter[heapFilter.length - 2].frame!.width - 1; - heapFilter[heapFilter.length - 1].frame!.width = 1; - heapFilter[heapFilter.length - 1].frame!.x -= 1; - } - } - // 只有一条数据并且数据在结束点 - if (heapFilter.length === 1 && row.frame.width === heapFilter[0].frame?.x) { - heapFilter[0].frame!.x -= 1; - } - req.context.beginPath(); - let find = false; - for (let re of heapFilter) { - if (row.isHover && re.frame && !find && isFrameContainPoint(re.frame, row.hoverX, row.hoverY)) { - HeapStruct.hoverHeapStruct = re; - find = true; - } + setRenderHeapFrame(heapFilter, row); + drawHeap(req, heapFilter, row); + } +} + +function setRenderHeapFrame(heapFilter: HeapStruct[], row: TraceRow): void { + // 多条数据,最后一条数据在结束点也需要绘制 + if (heapFilter.length >= 2 && heapFilter[heapFilter.length - 1].dur === 0) { + if (heapFilter[heapFilter.length - 2].frame && heapFilter[heapFilter.length - 1].frame) { + heapFilter[heapFilter.length - 2].frame!.width = heapFilter[heapFilter.length - 2].frame!.width - 1; + heapFilter[heapFilter.length - 1].frame!.width = 1; + heapFilter[heapFilter.length - 1].frame!.x -= 1; } - for (let re of heapFilter) { - HeapStruct.drawHeap(req.context, re, row.drawType); + } + // 只有一条数据并且数据在结束点 + if (heapFilter.length === 1 && row.frame.width === heapFilter[0].frame?.x) { + heapFilter[0].frame!.x -= 1; + } +} + +function drawHeap( + req: { + context: CanvasRenderingContext2D; + useCache: boolean; + type: string; + }, + heapFilter: HeapStruct[], + row: TraceRow +) { + req.context.beginPath(); + let find = false; + for (let re of heapFilter) { + if (row.isHover && re.frame && !find && isFrameContainPoint(re.frame, row.hoverX, row.hoverY)) { + HeapStruct.hoverHeapStruct = re; + find = true; } - if (!find && row.isHover) HeapStruct.hoverHeapStruct = undefined; - req.context.closePath(); } + for (let re of heapFilter) { + HeapStruct.drawHeap(req.context, re, row.drawType); + } + if (!find && row.isHover) HeapStruct.hoverHeapStruct = undefined; + req.context.closePath(); } + export function heap( heapList: Array, res: Array, @@ -77,14 +95,7 @@ export function heap( use: boolean ) { if (use && res.length > 0) { - for (let i = 0; i < res.length; i++) { - let it = res[i]; - if ((it.startTime || 0) + (it.dur || 0) > startNS && (it.startTime || 0) <= endNS) { - HeapStruct.setFrame(res[i], 5, startNS, endNS, totalNS, frame); - } else { - res[i].frame = null; - } - } + setHeapFrameIfUse(res, startNS, endNS, totalNS, frame); return; } res.length = 0; @@ -104,6 +115,39 @@ export function heap( } } +function setHeapFrameIfUse(res: Array, startNS: number, endNS: number, totalNS: number, frame: any) { + for (let i = 0; i < res.length; i++) { + let it = res[i]; + if ((it.startTime || 0) + (it.dur || 0) > startNS && (it.startTime || 0) <= endNS) { + HeapStruct.setFrame(res[i], 5, startNS, endNS, totalNS, frame); + } else { + res[i].frame = null; + } + } +} + +export function HeapStructOnClick(clickRowType: string, sp: SpSystemTrace, row: undefined | TraceRow) { + return new Promise((resolve,reject) => { + if ( + clickRowType === TraceRow.ROW_TYPE_HEAP && + row && + row.getAttribute('heap-type') === 'native_hook_statistic' && + HeapStruct.hoverHeapStruct + ) { + HeapStruct.selectHeapStruct = HeapStruct.hoverHeapStruct; + const key = row.rowParentId!.split(' '); + let ipid = 1; + if (key.length > 0) { + ipid = Number(key[key.length - 1]); + } + sp.traceSheetEL?.displayNativeHookData(HeapStruct.selectHeapStruct, row.rowId!, ipid); + sp.timerShaftEL?.modifyFlagList(undefined); + reject(); + }else{ + resolve(null); + } + }); +} export class HeapStruct extends BaseHeapStruct { static hoverHeapStruct: HeapStruct | undefined; static selectHeapStruct: HeapStruct | undefined; diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerHeapSnapshot.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerHeapSnapshot.ts index 127d557c..1fe6e265 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerHeapSnapshot.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerHeapSnapshot.ts @@ -17,6 +17,7 @@ import { BaseStruct, Rect, Render, drawLoadingFrame, isFrameContainPoint } from import { TraceRow } from '../../component/trace/base/TraceRow'; import { Utils } from '../../component/trace/base/Utils'; +import {SpSystemTrace} from "../../component/SpSystemTrace"; export class HeapSnapshotRender extends Render { renderMainThread( req: { @@ -63,6 +64,25 @@ export function HeapSnapshot( } } const padding = 3; +export function HeapSnapshotStructOnClick(clickRowType: string, sp: SpSystemTrace, snapshotClickHandler: any) { + return new Promise((resolve, reject) => { + if (clickRowType === TraceRow.ROW_TYPE_HEAP_SNAPSHOT && HeapSnapshotStruct.hoverSnapshotStruct) { + let snapshotRow = sp.shadowRoot?.querySelector>( + `trace-row[row-id='heapsnapshot']` + ); + HeapSnapshotStruct.selectSnapshotStruct = HeapSnapshotStruct.hoverSnapshotStruct; + sp.traceSheetEL?.displaySnapshotData( + HeapSnapshotStruct.selectSnapshotStruct!, + snapshotRow!.dataListCache, + snapshotClickHandler + ); + reject(); + }else{ + resolve(null); + } + }); + +} export class HeapSnapshotStruct extends BaseStruct { startTs: number = 0; endTs: number = 0; diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerIrq.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerIrq.ts index d92f8621..2b3927dc 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerIrq.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerIrq.ts @@ -24,6 +24,7 @@ import { } from './ProcedureWorkerCommon'; import { TraceRow } from '../../component/trace/base/TraceRow'; import { ColorUtils } from '../../component/trace/base/ColorUtils'; +import {SpSystemTrace} from "../../component/SpSystemTrace"; export class IrqRender extends Render { renderMainThread( @@ -69,6 +70,18 @@ export class IrqRender extends Render { } const padding = 3; +export function IrqStructOnClick(clickRowType: string,sp:SpSystemTrace) { + return new Promise((resolve, reject) => { + if (clickRowType === TraceRow.ROW_TYPE_IRQ && IrqStruct.hoverIrqStruct) { + IrqStruct.selectIrqStruct = IrqStruct.hoverIrqStruct; + sp.traceSheetEL?.displayIrqData(IrqStruct.selectIrqStruct); + sp.timerShaftEL?.modifyFlagList(undefined); + reject(); + }else{ + resolve(null); + } + }); +} export class IrqStruct extends BaseStruct { static maxValue: number = 0; static maxName: string = ''; diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerJank.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerJank.ts index 11025d40..16c29989 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerJank.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerJank.ts @@ -13,17 +13,18 @@ * limitations under the License. */ -import { JanksStruct } from '../../bean/JanksStruct'; -import { ColorUtils } from '../../component/trace/base/ColorUtils'; -import { TraceRow } from '../../component/trace/base/TraceRow'; +import {JanksStruct} from '../../bean/JanksStruct'; +import {ColorUtils} from '../../component/trace/base/ColorUtils'; +import {TraceRow} from '../../component/trace/base/TraceRow'; import { + drawLoadingFrame, + drawString, isFrameContainPoint, ns2x, Render, RequestMessage, - drawString, - drawLoadingFrame, } from './ProcedureWorkerCommon'; +import {SpSystemTrace} from "../../component/SpSystemTrace"; export class JankRender extends Render { renderMainThread( @@ -75,7 +76,8 @@ export class JankRender extends Render { req.context.closePath(); } - render(req: RequestMessage, list: Array, filter: Array): void {} + render(req: RequestMessage, list: Array, filter: Array): void { + } } export function jank( @@ -116,6 +118,38 @@ export function jank( } } +export function JankStructOnClick(clickRowType: string, sp: SpSystemTrace, jankClickHandler: any) { + return new Promise((resolve, reject) => { + if (clickRowType === TraceRow.ROW_TYPE_JANK && JankStruct.hoverJankStruct) { + JankStruct.selectJankStructList.length = 0; + sp.removeLinkLinesByBusinessType('janks'); + JankStruct.selectJankStruct = JankStruct.hoverJankStruct; + sp.timerShaftEL?.drawTriangle(JankStruct.selectJankStruct!.ts || 0, 'inverted'); + sp.traceSheetEL?.displayJankData( + JankStruct.selectJankStruct, + (datas) => { + datas.forEach((data) => { + let endParentRow; + if (data.frame_type == 'frameTime') { + endParentRow = sp.shadowRoot?.querySelector>( + `trace-row[row-id='frameTime'][row-type='janks']` + ); + } else { + endParentRow = sp.shadowRoot?.querySelector>(`trace-row[row-id='${data.pid}'][folder]`); + } + sp.drawJankLine(endParentRow, JankStruct.selectJankStruct!, data); + }); + }, + jankClickHandler + ); + reject(); + } else { + resolve(null); + } + }); + +} + export class JankStruct extends JanksStruct { static hoverJankStruct: JankStruct | undefined; static selectJankStruct: JankStruct | undefined; @@ -219,6 +253,7 @@ export class JankStruct extends JanksStruct { } } } + private static drawActualFrame(ctx: CanvasRenderingContext2D, data: JankStruct, miniHeight: number): void { ctx.fillStyle = ColorUtils.JANK_COLOR[0]; if (data.jank_tag === 1) { @@ -230,6 +265,7 @@ export class JankStruct extends JanksStruct { ctx.fillRect(data.frame.x, data.frame.y, data.frame.width, miniHeight - padding * 2); } } + static isSelected(data: JankStruct): boolean { return ( JankStruct.selectJankStruct != undefined && diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerMemoryAbility.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerMemoryAbility.ts index 884ab924..1bc574d5 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerMemoryAbility.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerMemoryAbility.ts @@ -113,19 +113,19 @@ function setMemoryAbility( if (memoryAbilityList) { for (let memoryAbilityIndex = 0; memoryAbilityIndex < memoryAbilityList.length; memoryAbilityIndex++) { let item = memoryAbilityList[memoryAbilityIndex]; - if (memoryAbilityIndex === memoryAbilityList.length - 1) { - item.dur = (endNS || 0) - (item.startNS || 0); - } else { - item.dur = (memoryAbilityList[memoryAbilityIndex + 1].startNS || 0) - (item.startNS || 0); - } + item.dur = + memoryAbilityIndex === memoryAbilityList.length - 1 + ? (endNS || 0) - (item.startNS || 0) + : (memoryAbilityList[memoryAbilityIndex + 1].startNS || 0) - (item.startNS || 0); if ((item.startNS || 0) + (item.dur || 0) > startNS && (item.startNS || 0) < endNS) { MemoryAbilityMonitorStruct.setMemoryFrame(item, 5, startNS, endNS, totalNS, frame); if ( - memoryAbilityIndex > 0 && - (memoryAbilityList[memoryAbilityIndex - 1].frame?.x || 0) == (item.frame?.x || 0) && - (memoryAbilityList[memoryAbilityIndex - 1].frame?.width || 0) == (item.frame?.width || 0) + !( + memoryAbilityIndex > 0 && + (memoryAbilityList[memoryAbilityIndex - 1].frame.x || 0) == (item.frame.x || 0) && + (memoryAbilityList[memoryAbilityIndex - 1].frame.width || 0) == (item.frame.width || 0) + ) ) { - } else { res.push(item); } } diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerProcess.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerProcess.ts index eef04eea..c02dc495 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerProcess.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerProcess.ts @@ -75,11 +75,12 @@ export function proc( if ((it.startTime || 0) + (it.dur || 0) > startNS && (it.startTime || 0) < endNS) { ProcessStruct.setProcessFrame(processList[i], 5, startNS, endNS, totalNS, frame); if ( - i > 0 && - (processList[i - 1].frame?.x || 0) == (processList[i].frame?.x || 0) && - (processList[i - 1].frame?.width || 0) == (processList[i].frame?.width || 0) + !( + i > 0 && + (processList[i - 1].frame.x || 0) == (processList[i].frame.x || 0) && + (processList[i - 1].frame.width || 0) == (processList[i].frame.width || 0) + ) ) { - } else { res.push(processList[i]); } } diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerSnapshot.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerSnapshot.ts index fcbd4188..b92c9e66 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerSnapshot.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerSnapshot.ts @@ -16,6 +16,7 @@ import { BaseStruct, Rect, Render, drawLoadingFrame, isFrameContainPoint, ns2x } import { TraceRow } from '../../component/trace/base/TraceRow'; import { Utils } from '../../component/trace/base/Utils'; import { MemoryConfig } from '../../bean/MemoryConfig'; +import {SpSystemTrace} from "../../component/SpSystemTrace"; export class SnapshotRender extends Render { renderMainThread( @@ -66,6 +67,113 @@ export function snapshot( } } const padding = 2; +export function SnapshotStructOnClick(clickRowType: string, sp: SpSystemTrace){ + return new Promise((resolve, reject) => { + if (clickRowType === TraceRow.ROW_TYPE_SYS_MEMORY_GPU_TOTAL && SnapshotStruct.hoverSnapshotStruct) { + let gpuDumpTotalRow = sp.shadowRoot?.querySelector>( + `trace-row[row-id='Skia Gpu Dump Total']` + ); + SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; + sp.traceSheetEL?.displayGpuSelectedData( + 'total', + SnapshotStruct.selectSnapshotStruct.startNs, + gpuDumpTotalRow!.dataListCache + ); + sp.timerShaftEL?.modifyFlagList(undefined); + reject(); + } else if (clickRowType === TraceRow.ROW_TYPE_SYS_MEMORY_GPU_WINDOW && SnapshotStruct.hoverSnapshotStruct) { + let gpuDumpWindowRow = sp.shadowRoot?.querySelector>( + `trace-row[row-id='Skia Gpu Dump Window']` + ); + SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; + sp.traceSheetEL?.displayGpuSelectedData( + 'window', + SnapshotStruct.selectSnapshotStruct.startNs, + gpuDumpWindowRow!.dataListCache + ); + sp.timerShaftEL?.modifyFlagList(undefined); + reject(); + } else if (clickRowType === TraceRow.ROW_TYPE_VM_TRACKER_SMAPS && SnapshotStruct.hoverSnapshotStruct) { + let smapsRow = sp.shadowRoot?.querySelector>(`trace-row[row-id='Dirty']`); + SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; + sp.traceSheetEL?.displaySmapsData(SnapshotStruct.selectSnapshotStruct!, smapsRow!.dataListCache); + reject(); + } if (clickRowType === TraceRow.ROW_TYPE_VMTRACKER_SHM && SnapshotStruct.hoverSnapshotStruct) { + let shmRow = sp.shadowRoot?.querySelector>(`trace-row[row-id='SHM']`); + SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; + sp.traceSheetEL?.displayShmData(SnapshotStruct.selectSnapshotStruct!, shmRow!.dataListCache); + reject(); + } if (clickRowType === TraceRow.ROW_TYPE_PURGEABLE_TOTAL_ABILITY && SnapshotStruct.hoverSnapshotStruct) { + let totalAbilityRow = sp.shadowRoot?.querySelector>( + `trace-row[row-id='System Purgeable Total']` + ); + SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; + sp.traceSheetEL?.displayPurgTotalAbilityData( + SnapshotStruct.hoverSnapshotStruct, + totalAbilityRow!.dataListCache + ); + reject(); + } if (clickRowType === TraceRow.ROW_TYPE_PURGEABLE_PIN_ABILITY && SnapshotStruct.hoverSnapshotStruct) { + let pinAbilityRow = sp.shadowRoot?.querySelector>( + `trace-row[row-id='System Purgeable Pin']` + ); + SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; + sp.traceSheetEL?.displayPurgPinAbilityData(SnapshotStruct.hoverSnapshotStruct, pinAbilityRow!.dataListCache); + reject(); + } if (clickRowType === TraceRow.ROW_TYPE_PURGEABLE_TOTAL_VM && SnapshotStruct.hoverSnapshotStruct) { + let totalVMRow = sp.shadowRoot?.querySelector>(`trace-row[row-id='Purgeable Total']`); + SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; + sp.traceSheetEL?.displayPurgTotalVMData(SnapshotStruct.hoverSnapshotStruct, totalVMRow!.dataListCache); + reject(); + } if (clickRowType === TraceRow.ROW_TYPE_PURGEABLE_PIN_VM && SnapshotStruct.hoverSnapshotStruct) { + let pinVMRow = sp.shadowRoot?.querySelector>(`trace-row[row-id='Purgeable Pin']`); + SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; + sp.traceSheetEL?.displayPurgPinVMData(SnapshotStruct.hoverSnapshotStruct, pinVMRow!.dataListCache); + reject(); + } if (clickRowType === TraceRow.ROW_TYPE_DMA_ABILITY && SnapshotStruct.hoverSnapshotStruct) { + let dmaAbilityRow = sp.shadowRoot?.querySelector>( + `trace-row[row-id='abilityMonitorDma']` + ); + SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; + sp.traceSheetEL?.displayDmaAbility(SnapshotStruct.selectSnapshotStruct.startNs, dmaAbilityRow!.dataListCache); + reject(); + } if (clickRowType === TraceRow.ROW_TYPE_DMA_VMTRACKER && SnapshotStruct.hoverSnapshotStruct) { + let dmaVmTracker = sp.shadowRoot?.querySelector>( + `trace-row[row-type='dma-vmTracker']` + ); + SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; + sp.traceSheetEL?.displayDmaVmTracker(SnapshotStruct.selectSnapshotStruct.startNs, dmaVmTracker!.dataListCache); + reject(); + } if (clickRowType === TraceRow.ROW_TYPE_GPU_MEMORY_ABILITY && SnapshotStruct.hoverSnapshotStruct) { + let gpuMemoryAbilityMonitor = sp.shadowRoot?.querySelector>( + `trace-row[row-id='abilityMonitorGpuMemory']` + ); + SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; + sp.traceSheetEL?.displayGpuMemoryAbility( + SnapshotStruct.selectSnapshotStruct.startNs, + gpuMemoryAbilityMonitor!.dataListCache + ); + reject(); + } if (clickRowType === TraceRow.ROW_TYPE_GPU_MEMORY_VMTRACKER && SnapshotStruct.hoverSnapshotStruct) { + let gpuMemoryVmTracker = sp.shadowRoot?.querySelector>( + `trace-row[row-id='Skia Gpu Memory']` + ); + SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; + sp.traceSheetEL?.displayGpuMemoryVmTracker( + SnapshotStruct.selectSnapshotStruct.startNs, + gpuMemoryVmTracker!.dataListCache + ); + reject(); + } if (clickRowType === TraceRow.ROW_TYPE_GPU_RESOURCE_VMTRACKER && SnapshotStruct.hoverSnapshotStruct) { + SnapshotStruct.selectSnapshotStruct = SnapshotStruct.hoverSnapshotStruct; + sp.traceSheetEL?.displayGpuResourceVmTracker(SnapshotStruct.selectSnapshotStruct.startNs); + reject(); + } else{ + resolve(null); + } + }); + +} export class SnapshotStruct extends BaseStruct { startNs: number = 0; endNs: number = 0; diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerSoInit.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerSoInit.ts index 90c53b11..875afa1f 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerSoInit.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerSoInit.ts @@ -16,6 +16,7 @@ import { ColorUtils } from '../../component/trace/base/ColorUtils'; import { TraceRow } from '../../component/trace/base/TraceRow'; import { BaseStruct, isFrameContainPoint, ns2x, Render, RequestMessage, drawString } from './ProcedureWorkerCommon'; +import {SpSystemTrace} from "../../component/SpSystemTrace"; export class SoRender extends Render { renderMainThread( @@ -107,7 +108,18 @@ export function soDataFilter( }); } } - +export function SoStructOnClick(clickRowType: string, sp: SpSystemTrace, scrollToFuncHandler: any) { + return new Promise((resolve, reject)=>{ + if (clickRowType === TraceRow.ROW_TYPE_STATIC_INIT && SoStruct.hoverSoStruct) { + SoStruct.selectSoStruct = SoStruct.hoverSoStruct; + sp.traceSheetEL?.displayStaticInitData(SoStruct.selectSoStruct, scrollToFuncHandler); + sp.timerShaftEL?.modifyFlagList(undefined); + reject(); + }else{ + resolve(null); + } + }) +} export class SoStruct extends BaseStruct { static hoverSoStruct: SoStruct | undefined; static selectSoStruct: SoStruct | undefined; diff --git a/ide/src/trace/database/ui-worker/ProcedureWorkerThread.ts b/ide/src/trace/database/ui-worker/ProcedureWorkerThread.ts index 6b88b6ce..f9ab36d3 100644 --- a/ide/src/trace/database/ui-worker/ProcedureWorkerThread.ts +++ b/ide/src/trace/database/ui-worker/ProcedureWorkerThread.ts @@ -26,6 +26,7 @@ import { import { TraceRow } from '../../component/trace/base/TraceRow'; import { Utils } from '../../component/trace/base/Utils'; import { ThreadStruct as BaseThreadStruct } from '../../bean/ThreadStruct'; +import {SpSystemTrace} from "../../component/SpSystemTrace"; export class ThreadRender extends Render { renderMainThread( threadReq: { @@ -64,7 +65,20 @@ export class ThreadRender extends Render { } const padding = 3; - +export function ThreadStructOnClick(clickRowType:string,sp:SpSystemTrace,threadClickHandler:any,cpuClickHandler:any){ + return new Promise((resolve, reject) => { + if (clickRowType === TraceRow.ROW_TYPE_THREAD && ThreadStruct.hoverThreadStruct) { + sp.removeLinkLinesByBusinessType('thread'); + ThreadStruct.selectThreadStruct = ThreadStruct.hoverThreadStruct; + sp.timerShaftEL?.drawTriangle(ThreadStruct.selectThreadStruct!.startTime || 0, 'inverted'); + sp.traceSheetEL?.displayThreadData(ThreadStruct.selectThreadStruct, threadClickHandler, cpuClickHandler); + sp.timerShaftEL?.modifyFlagList(undefined); + reject(); + }else{ + resolve(null); + } + }); +} export class ThreadStruct extends BaseThreadStruct { static otherColor = '#673ab7'; static uninterruptibleSleepColor = '#f19d38'; diff --git a/ide/src/trace/database/ui-worker/ProduceWorkerSdkCounter.ts b/ide/src/trace/database/ui-worker/ProduceWorkerSdkCounter.ts index 7a411e35..fcaa7ee7 100644 --- a/ide/src/trace/database/ui-worker/ProduceWorkerSdkCounter.ts +++ b/ide/src/trace/database/ui-worker/ProduceWorkerSdkCounter.ts @@ -98,19 +98,19 @@ function setSdkCounterFilter( if (sdkCounterList) { for (let index = 0; index < sdkCounterList.length; index++) { let item = sdkCounterList[index]; - if (index === sdkCounterList.length - 1) { - item.dur = endNS - (item.ts || 0); - } else { - item.dur = (sdkCounterList[index + 1].ts || 0) - (item.ts || 0); - } + item.dur = + index === sdkCounterList.length - 1 + ? endNS - (item.ts || 0) + : (sdkCounterList[index + 1].ts || 0) - (item.ts || 0); if ((item.ts || 0) + (item.dur || 0) > startNS && (item.ts || 0) < endNS) { CounterStruct.setCounterFrame(sdkCounterList[index], 5, startNS, endNS, totalNS, frame); if ( - index > 0 && - (sdkCounterList[index - 1].frame?.x || 0) === (sdkCounterList[index].frame?.x || 0) && - (sdkCounterList[index - 1].frame?.width || 0) === (sdkCounterList[index].frame?.width || 0) + !( + index > 0 && + (sdkCounterList[index - 1].frame?.x || 0) === (sdkCounterList[index].frame?.x || 0) && + (sdkCounterList[index - 1].frame?.width || 0) === (sdkCounterList[index].frame?.width || 0) + ) ) { - } else { sdkCounterFilters.push(item); } } diff --git a/ide/src/trace/database/ui-worker/ProduceWorkerSdkSlice.ts b/ide/src/trace/database/ui-worker/ProduceWorkerSdkSlice.ts index c90c1980..9271ef42 100644 --- a/ide/src/trace/database/ui-worker/ProduceWorkerSdkSlice.ts +++ b/ide/src/trace/database/ui-worker/ProduceWorkerSdkSlice.ts @@ -76,7 +76,9 @@ export class SdkSliceRender extends Render { return; } sdkSliceFilters.length = 0; - setSdkSliceFilter(sdkList, sdkSliceFilters, startNS, endNS, totalNS, frame); + if (sdkList) { + setSdkSliceFilter(sdkList, sdkSliceFilters, startNS, endNS, totalNS, frame); + } } } function setSdkSliceFilter( @@ -87,22 +89,21 @@ function setSdkSliceFilter( totalNS: number, frame: any ) { - if (sdkList) { - for (let index = 0; index < sdkList.length; index++) { - let item = sdkList[index]; - if (item.start_ts >= startNS && item.end_ts === 0) { - item.end_ts = endNS; - } - if ((item.end_ts || 0) > startNS && (item.start_ts || 0) < endNS) { - SdkSliceStruct.setSdkSliceFrame(sdkList[index], 5, startNS, endNS, totalNS, frame); - if ( + for (let index = 0; index < sdkList.length; index++) { + let item = sdkList[index]; + if (item.start_ts >= startNS && item.end_ts === 0) { + item.end_ts = endNS; + } + if ((item.end_ts || 0) > startNS && (item.start_ts || 0) < endNS) { + SdkSliceStruct.setSdkSliceFrame(sdkList[index], 5, startNS, endNS, totalNS, frame); + if ( + !( index > 0 && (sdkList[index - 1].frame?.x || 0) === (sdkList[index].frame?.x || 0) && (sdkList[index - 1].frame?.width || 0) === (sdkList[index].frame?.width || 0) - ) { - } else { - sdkSliceFilters.push(item); - } + ) + ) { + sdkSliceFilters.push(item); } } } diff --git a/ide/src/trace/database/ui-worker/cpu/ProcedureWorkerCPU.ts b/ide/src/trace/database/ui-worker/cpu/ProcedureWorkerCPU.ts index da4faad9..71d3a84c 100644 --- a/ide/src/trace/database/ui-worker/cpu/ProcedureWorkerCPU.ts +++ b/ide/src/trace/database/ui-worker/cpu/ProcedureWorkerCPU.ts @@ -193,7 +193,27 @@ export class CpuRender { cpuRes.push(...slice.filter((it) => it.v)); } } +export function CpuStructOnClick(rowType: string, sp: SpSystemTrace, cpuClickHandler: any) { + return new Promise((resolve,reject) => { + if (rowType === TraceRow.ROW_TYPE_CPU && CpuStruct.hoverCpuStruct) { + CpuStruct.selectCpuStruct = CpuStruct.hoverCpuStruct; + sp.timerShaftEL?.drawTriangle(CpuStruct.selectCpuStruct!.startTime || 0, 'inverted'); + sp.traceSheetEL?.displayCpuData( + CpuStruct.selectCpuStruct, + (wakeUpBean) => { + CpuStruct.wakeupBean = wakeUpBean; + sp.refreshCanvas(false); + }, + cpuClickHandler + ); + sp.timerShaftEL?.modifyFlagList(undefined); + reject(); + }else{ + resolve(null); + } + }); +} export class CpuStruct extends BaseStruct { static cpuCount: number = 1; //最大cpu数量 static hoverCpuStruct: CpuStruct | undefined; diff --git a/ide/src/trace/database/ui-worker/cpu/ProcedureWorkerCpuFreqLimits.ts b/ide/src/trace/database/ui-worker/cpu/ProcedureWorkerCpuFreqLimits.ts index c4d55d8a..18a38516 100644 --- a/ide/src/trace/database/ui-worker/cpu/ProcedureWorkerCpuFreqLimits.ts +++ b/ide/src/trace/database/ui-worker/cpu/ProcedureWorkerCpuFreqLimits.ts @@ -28,6 +28,7 @@ import { import { ColorUtils } from '../../../component/trace/base/ColorUtils'; import { TraceRow } from '../../../component/trace/base/TraceRow'; import { convertJSON } from '../../logic-worker/ProcedureLogicWorkerCommon'; +import {SpSystemTrace} from "../../../component/SpSystemTrace"; export class CpuFreqLimitRender extends Render { renderMainThread( @@ -80,7 +81,18 @@ export class CpuFreqLimitRender extends Render { cpuFreqLimitReq.context.fillText(s, 4, 5 + 9); } } - +export function CpuFreqLimitsStructOnClick(clickRowType: string, sp: SpSystemTrace) { + return new Promise((resolve, reject) => { + if (clickRowType === TraceRow.ROW_TYPE_CPU_FREQ_LIMIT && CpuFreqLimitsStruct.hoverCpuFreqLimitsStruct) { + CpuFreqLimitsStruct.selectCpuFreqLimitsStruct = CpuFreqLimitsStruct.hoverCpuFreqLimitsStruct; + sp.traceSheetEL?.displayFreqLimitData(); + sp.timerShaftEL?.modifyFlagList(undefined); + reject(); + }else{ + resolve(null); + } + }); +} export class CpuFreqLimitsStruct extends BaseStruct { static hoverCpuFreqLimitsStruct: CpuFreqLimitsStruct | undefined; static selectCpuFreqLimitsStruct: CpuFreqLimitsStruct | undefined; diff --git a/ide/src/trace/database/ui-worker/cpu/ProcedureWorkerCpuState.ts b/ide/src/trace/database/ui-worker/cpu/ProcedureWorkerCpuState.ts index d7ac406b..926ca101 100644 --- a/ide/src/trace/database/ui-worker/cpu/ProcedureWorkerCpuState.ts +++ b/ide/src/trace/database/ui-worker/cpu/ProcedureWorkerCpuState.ts @@ -30,6 +30,7 @@ import { import { TraceRow } from '../../../component/trace/base/TraceRow'; import { ColorUtils } from '../../../component/trace/base/ColorUtils'; import { convertJSON } from '../../logic-worker/ProcedureLogicWorkerCommon'; +import {SpSystemTrace} from "../../../component/SpSystemTrace"; export class CpuStateRender extends PerfRender { renderMainThread( @@ -164,7 +165,18 @@ export class CpuStateRender extends PerfRender { } } } - +export function CpuStateStructOnClick(clickRowType: string, sp: SpSystemTrace) { + return new Promise((resolve, reject) => { + if (clickRowType === TraceRow.ROW_TYPE_CPU_STATE && CpuStateStruct.hoverStateStruct) { + CpuStateStruct.selectStateStruct = CpuStateStruct.hoverStateStruct; + sp.traceSheetEL?.displayCpuStateData(); + sp.timerShaftEL?.modifyFlagList(undefined); + reject(); + }else{ + resolve(null); + } + }); +} export class CpuStateStruct extends BaseStruct { static hoverStateStruct: CpuStateStruct | undefined; static selectStateStruct: CpuStateStruct | undefined; diff --git a/ide/src/trace/database/ui-worker/hiperf/ProcedureWorkerHiPerfReport.ts b/ide/src/trace/database/ui-worker/hiperf/ProcedureWorkerHiPerfReport.ts index 8bc24248..1a432d03 100644 --- a/ide/src/trace/database/ui-worker/hiperf/ProcedureWorkerHiPerfReport.ts +++ b/ide/src/trace/database/ui-worker/hiperf/ProcedureWorkerHiPerfReport.ts @@ -39,37 +39,46 @@ export class HiperfReportRender extends PerfRender { hiPerfReportReq.intervalPerf, hiPerfReportReq.useCache || (TraceRow.range?.refresh ?? false) ); - hiPerfReportReq.context.beginPath(); - hiPerfReportReq.context.fillStyle = ColorUtils.FUNC_COLOR[0]; - hiPerfReportReq.context.strokeStyle = ColorUtils.FUNC_COLOR[0]; - let normalPath = new Path2D(); - let specPath = new Path2D(); - let offset = groupBy10MS ? 0 : 3; - let find = false; - for (let re of filter) { - HiPerfReportStruct.draw(hiPerfReportReq.context, normalPath, specPath, re, groupBy10MS); - if (row.isHover) { - if (re.frame && row.hoverX >= re.frame.x - offset && row.hoverX <= re.frame.x + re.frame.width + offset) { - HiPerfReportStruct.hoverStruct = re; - find = true; - } - } - } - if (!find && row.isHover) { - HiPerfReportStruct.hoverStruct = undefined; - } - if (groupBy10MS) { - hiPerfReportReq.context.fill(normalPath); - } else { - hiPerfReportReq.context.stroke(normalPath); - HiPerfStruct.drawSpecialPath(hiPerfReportReq.context, specPath); - } - hiPerfReportReq.context.closePath(); + drawHiperfReportRender(hiPerfReportReq, groupBy10MS, filter, row); } render(hiPerfReportRequest: RequestMessage, list: Array, filter: Array, dataList2: Array): void {} } +function drawHiperfReportRender( + hiPerfReportReq: any, + groupBy10MS: boolean, + filter: HiPerfReportStruct[], + row: TraceRow +) { + hiPerfReportReq.context.beginPath(); + hiPerfReportReq.context.fillStyle = ColorUtils.FUNC_COLOR[0]; + hiPerfReportReq.context.strokeStyle = ColorUtils.FUNC_COLOR[0]; + let normalPath = new Path2D(); + let specPath = new Path2D(); + let offset = groupBy10MS ? 0 : 3; + let find = false; + for (let re of filter) { + HiPerfReportStruct.draw(hiPerfReportReq.context, normalPath, specPath, re, groupBy10MS); + if (row.isHover) { + if (re.frame && row.hoverX >= re.frame.x - offset && row.hoverX <= re.frame.x + re.frame.width + offset) { + HiPerfReportStruct.hoverStruct = re; + find = true; + } + } + } + if (!find && row.isHover) { + HiPerfReportStruct.hoverStruct = undefined; + } + if (groupBy10MS) { + hiPerfReportReq.context.fill(normalPath); + } else { + hiPerfReportReq.context.stroke(normalPath); + HiPerfStruct.drawSpecialPath(hiPerfReportReq.context, specPath); + } + hiPerfReportReq.context.closePath(); +} + function setFrameByfilter(startNS: number, endNS: number, frame: any, hiPerfFilters: Array): void { let pns = (endNS - startNS) / frame.width; let y = frame.y; diff --git a/ide/test/trace/database/data-trafic/AbilityMonitorReceiver.test.ts b/ide/test/trace/database/data-trafic/AbilityMonitorReceiver.test.ts deleted file mode 100644 index ea2f3046..00000000 --- a/ide/test/trace/database/data-trafic/AbilityMonitorReceiver.test.ts +++ /dev/null @@ -1,105 +0,0 @@ -/* - * Copyright (C) 2022 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 { TraficEnum } from '../../../../src/trace/database/data-trafic/QueryEnum'; -import { - abilityBytesInTraceDataProtoSql, abilityBytesInTraceDataReceiver, - abilityBytesOutTraceDataProtoSql, abilityBytesOutTraceDataReceiver, - abilityBytesReadDataProtoSql, abilityBytesReadDataReceiver, - abilityBytesWrittenDataProtoSql, abilityBytesWrittenDataReceiver, - abilityMemoryDataProtoSql, abilityMemoryUsedDataReceiver, - abilityPacketInDataProtoSql, abilityPacketInTraceDataReceiver, - abilityPacketsOutDataProtoSql, abilityPacketsOutTraceDataReceiver, - abilityReadOpsDataProtoSql, abilityReadOpsDataReceiver, - abilityWrittenOpsDataProtoSql, abilityWrittenOpsDataReceiver, - cpuAbilityMonitorDataProtoSql, cpuAbilityMonitorDataReceiver, - cpuAbilitySystemDataProtoSql, cpuAbilitySystemDataReceiver, - cpuAbilityUserDataProtoSql, cpuAbilityUserDataReceiver -} from '../../../../src/trace/database/data-trafic/AbilityMonitorReceiver'; - -describe('AbilityMonitorReceiver Test', () => { - let data; - let proc; - - beforeEach(() => { - data = { - params: { - trafic: TraficEnum.ProtoBuffer, - sharedArrayBuffers: { - id: new Uint16Array([1, 2, 3]), - }, - }, - }; - proc = jest.fn((sql) => [ - {abilityData: {id: 4, startNs: 4.4, pid: 40, tid: 400, dur: 40000, depth: 4}}, - {abilityData: {id: 5, startNs: 5.5, pid: 50, tid: 500, dur: 50000, depth: 5}}, - ]); - }); - it('AbilityMonitorReceiverTest01', () => { - const args = { - recordStartNS: 1000, - endNS: 3000, - startNS: 2000, - width: 10 - }; - expect(cpuAbilityMonitorDataProtoSql(args)).toBeTruthy(); - expect(cpuAbilityUserDataProtoSql(args)).toBeTruthy(); - expect(cpuAbilitySystemDataProtoSql(args)).toBeTruthy(); - expect(abilityMemoryDataProtoSql(args)).toBeTruthy(); - expect(abilityBytesReadDataProtoSql(args)).toBeTruthy(); - expect(abilityBytesWrittenDataProtoSql(args)).toBeTruthy(); - expect(abilityReadOpsDataProtoSql(args)).toBeTruthy(); - expect(abilityWrittenOpsDataProtoSql(args)).toBeTruthy(); - expect(abilityBytesInTraceDataProtoSql(args)).toBeTruthy(); - expect(abilityBytesOutTraceDataProtoSql(args)).toBeTruthy(); - expect(abilityPacketInDataProtoSql(args)).toBeTruthy(); - expect(abilityPacketsOutDataProtoSql(args)).toBeTruthy(); - }); - it('AbilityMonitorReceiverTest02', () => { - let mockPostMessage = jest.fn(); - global.postMessage = mockPostMessage; - abilityMemoryUsedDataReceiver(data, proc); - abilityBytesReadDataReceiver(data, proc); - abilityBytesWrittenDataReceiver(data, proc); - abilityReadOpsDataReceiver(data, proc); - abilityWrittenOpsDataReceiver(data, proc); - abilityBytesInTraceDataReceiver(data, proc); - abilityBytesOutTraceDataReceiver(data, proc); - abilityPacketInTraceDataReceiver(data, proc); - abilityPacketsOutTraceDataReceiver(data, proc); - - expect(mockPostMessage).toHaveBeenCalledTimes(9); - }); - it('AbilityMonitorReceiverTest03', () => { - let cpuAbilityData = { - params: { - trafic: TraficEnum.ProtoBuffer, - sharedArrayBuffers: { - id: new Uint16Array([1, 2, 3]), - }, - }, - }; - let cpuAbilityProc = jest.fn((sql) => [ - {cpuAbilityData: {id: 4, startNs: 4.4, pid: 40, tid: 400, dur: 40000, depth: 4}}, - {cpuAbilityData: {id: 5, startNs: 5.5, pid: 50, tid: 500, dur: 50000, depth: 5}}, - ]); - let mockPostMessage = jest.fn(); - global.postMessage = mockPostMessage; - cpuAbilityMonitorDataReceiver(cpuAbilityData, cpuAbilityProc); - cpuAbilityUserDataReceiver(cpuAbilityData, cpuAbilityProc); - cpuAbilitySystemDataReceiver(cpuAbilityData, cpuAbilityProc); - expect(mockPostMessage).toHaveBeenCalledTimes(3); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/AbilityMonitorSender.test.ts b/ide/test/trace/database/data-trafic/AbilityMonitorSender.test.ts deleted file mode 100644 index 3dad0349..00000000 --- a/ide/test/trace/database/data-trafic/AbilityMonitorSender.test.ts +++ /dev/null @@ -1,191 +0,0 @@ - -/* - * Copyright (C) 2022 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 { TraceRow } from '../../../../src/trace/component/trace/base/TraceRow'; -import { - cpuAbilityUserDataSender, - abilityMemoryUsedDataSender, - abilityBytesReadDataSender, - abilityBytesInTraceDataSender -} from '../../../../src/trace/database/data-trafic/AbilityMonitorSender'; -import { threadPool } from '../../../../src/trace/database/SqlLite'; -import { DiskAbilityMonitorStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerDiskIoAbility'; -import { NetworkAbilityMonitorStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerNetworkAbility'; -import { CpuAbilityMonitorStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerCpuAbility'; -import { MemoryAbilityMonitorStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerMemoryAbility'; -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); -describe('AbilityMonitorSender Test', () => { - let traceRowData = [{ - dur: 992876684, - frame: - {x: 16, y: 5, width: 17, height: 30}, - startNS: 992876648, - value: 6 - }] - let useTraceRowData = [{ - dur: 992876684, - frame: - {x: 16, y: 5, width: 17, height: 30}, - startNS: 992876648, - value: 2.62424483040067 - }] - let sysTraceRowData = [{ - dur: 992876684, - frame: - {x: 16, y: 5, width: 17, height: 30}, - startNS: 992876648, - value: 3.47458875272988 - }] - let memoryUsedData = [{ - dur: 4999371877, - frame: - {x: 68, y: 5, width: 83, height: 30}, - startNS: 4137882089, - value: 2012096 - }] - let bytesReadData = [{ - dur: 996109517, - frame: - {x: 16, y: 5, width: 17, height: 30}, - startNS: 1000118147, - value: 4 - }] - let bytesInTraceRowData = [{ - dur: 999981768, - frame: - {x: 16, y: 5, width: 18, height: 30}, - startNS: 1025721817, - value: 24 - }] - it('AbilityMonitorSenderTest01', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(traceRowData, traceRowData.length, true); - }); - let traceRow = TraceRow.skeleton(); - cpuAbilityUserDataSender(traceRow,'CpuAbilityMonitorData').then(res => { - expect(res).toHaveLength(1); - }); - }); - it('AbilityMonitorSenderTest02', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(useTraceRowData, useTraceRowData.length, true); - }); - let traceRow = TraceRow.skeleton(); - cpuAbilityUserDataSender(traceRow,'CpuAbilityUserData').then(res => { - expect(res).toHaveLength(1); - }); - }); - it('AbilityMonitorSenderTest03', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(sysTraceRowData, sysTraceRowData.length, true); - }); - let traceRow = TraceRow.skeleton(); - cpuAbilityUserDataSender(traceRow,'CpuAbilitySystemData').then(res => { - expect(res).toHaveLength(1); - }); - }); - it('AbilityMonitorSenderTest04', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(memoryUsedData, memoryUsedData.length, true); - }); - let memoryUsedTraceRow = TraceRow.skeleton(); - abilityMemoryUsedDataSender('2241',memoryUsedTraceRow).then(res => { - expect(res).toHaveLength(1); - }); - }); - it('AbilityMonitorSenderTest05', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(memoryUsedData, memoryUsedData.length, true); - }); - let memoryUsedTraceRow = TraceRow.skeleton(); - abilityMemoryUsedDataSender('2241',memoryUsedTraceRow).then(res => { - expect(res).toHaveLength(1); - }); - }); - it('AbilityMonitorSenderTest06', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(bytesReadData, bytesReadData.length, true); - }); - let traceRow = TraceRow.skeleton(); - abilityBytesReadDataSender(traceRow,'AbilityBytesReadData').then(res => { - expect(Array.isArray(res)).toBe(true); - }); - }); - it('AbilityMonitorSenderTest07', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(bytesReadData, bytesReadData.length, true); - }); - let traceRow = TraceRow.skeleton(); - abilityBytesReadDataSender(traceRow,'AbilityBytesWrittenData').then(res => { - expect(Array.isArray(res)).toBe(true); - }); - }); - it('AbilityMonitorSenderTest08', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(bytesReadData, bytesReadData.length, true); - }); - let traceRow = TraceRow.skeleton(); - abilityBytesReadDataSender(traceRow,'AbilityReadOpsData').then(res => { - expect(Array.isArray(res)).toBe(true); - }); - }); - it('AbilityMonitorSenderTest08', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(bytesReadData, bytesReadData.length, true); - }); - let traceRow = TraceRow.skeleton(); - abilityBytesReadDataSender(traceRow,'AbilityWrittenOpsData').then(res => { - expect(Array.isArray(res)).toBe(true); - }); - }); - it('AbilityMonitorSenderTest09', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(bytesInTraceRowData, bytesInTraceRowData.length, true); - }); - let traceRow = TraceRow.skeleton(); - abilityBytesInTraceDataSender(traceRow, 'AbilityBytesInTraceData').then(res => { - expect(res).toHaveLength(1); - }); - }); - it('AbilityMonitorSenderTest10', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(bytesInTraceRowData, bytesInTraceRowData.length, true); - }); - let traceRow = TraceRow.skeleton(); - abilityBytesInTraceDataSender(traceRow, 'AbilityBytesOutTraceData').then(res => { - expect(res).toHaveLength(1); - }); - }); - it('AbilityMonitorSenderTest11', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(bytesInTraceRowData, bytesInTraceRowData.length, true); - }); - let traceRow = TraceRow.skeleton(); - abilityBytesInTraceDataSender(traceRow, 'AbilityPacketInTraceData').then(res => { - expect(res).toHaveLength(1); - }); - }); - it('AbilityMonitorSenderTest12', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(bytesInTraceRowData, bytesInTraceRowData.length, true); - }); - let traceRow = TraceRow.skeleton(); - abilityBytesInTraceDataSender(traceRow, 'AbilityPacketsOutTraceData').then(res => { - expect(res).toHaveLength(1); - }); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/ArkTsReceiver.test.ts b/ide/test/trace/database/data-trafic/ArkTsReceiver.test.ts deleted file mode 100644 index cddbdc01..00000000 --- a/ide/test/trace/database/data-trafic/ArkTsReceiver.test.ts +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2022 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 { - cpuProfilerDataReceiver, - initCallChainDataSql, - queryChartDataSqlMem -} from '../../../../src/trace/database/data-trafic/ArkTsReceiver'; -import { DataCache, JsProfilerSymbol } from '../../../../src/trace/database/logic-worker/ProcedureLogicWorkerCommon'; - -describe('ArkTsReceiver Test', () => { - let data = { - id: "d460ac73-bcff-4021-9680-f4672b083e25", - name: 162, - action: "exec-proto", - params: { - startNS: 0, - endNS: 30108564984, - recordStartNS: 203639463442, - recordEndNS: 233748028426, - width: 507, - trafic: 3 - } - } - it('ArkTsReceiverTest01', () => { - const args = { - recordStartNS: 1000, - endNS: 3000, - startNS: 2000, - width: 10 - }; - expect(initCallChainDataSql(args)).toBeTruthy(); - expect(queryChartDataSqlMem(args)).toBeTruthy(); - }); - it('ArkTsReceiverTest02', () => { - (self as unknown as Worker).postMessage = jest.fn(() => true); - expect(cpuProfilerDataReceiver(data,()=>{ - return 0 - })).toBeUndefined() - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/ArkTsSender.test.ts b/ide/test/trace/database/data-trafic/ArkTsSender.test.ts deleted file mode 100644 index d0849e2a..00000000 --- a/ide/test/trace/database/data-trafic/ArkTsSender.test.ts +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright (C) 2022 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 { cpuProfilerDataSender } from '../../../../src/trace/database/data-trafic/ArkTsSender'; -import { threadPool } from '../../../../src/trace/database/SqlLite'; -import { TraceRow } from '../../../../src/trace/component/trace/base/TraceRow'; -import { JsCpuProfilerStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerCpuProfiler'; - -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); - -describe('cpuProfilerDataSender Test', () => { - let cpuProfilerData = { - column: [25, 30], - depth: [0, 1], - samplesIds: [[1, 2], [3, 4]], - childrenIds: [[5, 6], [7, 8]], - maxDepth: 5, - }; - it('cpuProfilerDataSenderTest01', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(cpuProfilerData, 1, true); - }); - let cpuProfilerDataTraceRow = TraceRow.skeleton(); - cpuProfilerDataSender(cpuProfilerDataTraceRow).then(result => { - expect(result).toBeTruthy(); - }); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/ClockDataReceiver.test.ts b/ide/test/trace/database/data-trafic/ClockDataReceiver.test.ts deleted file mode 100644 index b45dc39d..00000000 --- a/ide/test/trace/database/data-trafic/ClockDataReceiver.test.ts +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (C) 2022 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 { - chartClockDataSql, - chartClockDataSqlMem, - clockDataReceiver -} from '../../../../src/trace/database/data-trafic/ClockDataReceiver'; -import { TraficEnum } from '../../../../src/trace/database/data-trafic/QueryEnum'; - -describe('ClockDataReceiver Test', () => { - let data; - let proc; - beforeEach(() => { - data = { - id: 'bfcedc13-f545-434e-9914-c7823f1a6c17', - name: 4, - action: 'exec-proto', - params: { - clockName: 'cluster0_temp', - sqlType: 'clockFrequency', - startNS: 0, - endNS: 9427688540, - totalNS: 9427688540, - recordStartNS: 4049847357191, - recordEndNS: 4059275045731, - t: 1703747964987, - width: 491, - trafic: 2, - } - }; - proc = jest.fn((sql) => [ - {ClockData: {filterId: 89, startNs: 197364063, type: 'measure', value: 48000, dur: 230475000, px: 11}}, - {ClockData: {filterId: 0, startNs: 197364063, type: 'measure', value: 48000, dur: 230475000, px: 11}}, - ]); - }); - it('ClockDataReceiverTest01 ', function () { - const args = { - recordStartNS: 1000, - endNS: 3000, - startNS: 2000, - width: 10, - sqlType: 'clockFrequency' - }; - expect(chartClockDataSql(args)).toBeTruthy(); - expect(chartClockDataSqlMem(args)).toBeTruthy(); - }); - it('ClockDataReceiverTest02 ', function () { - const args = { - recordStartNS: 1000, - endNS: 3000, - startNS: 2000, - width: 10, - sqlType: 'screenState' - }; - expect(chartClockDataSql(args)).toBeTruthy(); - expect(chartClockDataSqlMem(args)).toBeTruthy(); - }); - it('hiSysEventDataReceiverTest03 ', function () { - const args = { - recordStartNS: 1000, - endNS: 3000, - startNS: 2000, - width: 10, - sqlType: 'clockState' - }; - expect(chartClockDataSql(args)).toBeTruthy(); - expect(chartClockDataSqlMem(args)).toBeTruthy(); - }); - it('hiSysEventDataReceiverTest04', () => { - const mockPostMessage = jest.fn(); - global.postMessage = mockPostMessage; - clockDataReceiver(data,proc); - expect(mockPostMessage).toHaveBeenCalledTimes(1); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/CpuDataReceiver.test.ts b/ide/test/trace/database/data-trafic/CpuDataReceiver.test.ts deleted file mode 100644 index 705f36e3..00000000 --- a/ide/test/trace/database/data-trafic/CpuDataReceiver.test.ts +++ /dev/null @@ -1,97 +0,0 @@ -/* - * Copyright (C) 2022 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 { - chartCpuDataProtoSql, - chartCpuDataProtoSqlMem, cpuDataReceiver -} from '../../../../src/trace/database/data-trafic/CpuDataReceiver'; - -describe('CpuDataReceiver Test', () => { - let data; - let proc; - let data2; - beforeEach(() => { - data = { - id: 'b1ba1ace-8f2b-4ce4-b27e-7a3bf2ff8499', - name: 0, - action: 'exec-proto', - params: { - cpu: 0, - startNS: 0, - endNS: 74946716780, - recordStartNS: 1395573006744, - recordEndNS: 1470519723524, - width: 491, - t: 1703729410566, - trafic: 0, - sharedArrayBuffers: { - processId: {}, - id: {}, - tid: {}, - cpu: {}, - dur: {}, - startTime: {}, - argSetId: {} - } - } - }; - data2 = { - id: 'b1ba1ace-8f2b-4ce4-b27e-7a3bf2ff8499', - name: 0, - action: 'exec-proto', - params: { - cpu: 0, - startNS: 0, - endNS: 74946716780, - recordStartNS: 1395573006744, - recordEndNS: 1470519723524, - width: 491, - t: 1703729410566, - trafic: 1, - sharedArrayBuffers: { - processId: {}, - id: {}, - tid: {}, - cpu: {}, - dur: {}, - startTime: {}, - argSetId: {} - } - } - }; - proc = jest.fn((sql) => [ - {CpuData: {id: 4, startTime: 4.4, processId: 40, tid: 400, cpu: 0, argSetId: 1, dur: 40000}}, - {CpuData: {id: 5, startTime: 5.5, processId: 50, tid: 500, cpu: 0, argSetId: 2, dur: 50000}}, - ]); - }); - it('CpuDataReceiverTest01 ', function () { - const args = { - recordStartNS: 1000, - endNS: 3000, - startNS: 2000, - width: 10, - cpu:0, - }; - expect(chartCpuDataProtoSql(args)).toBeTruthy(); - expect(chartCpuDataProtoSqlMem(args)).toBeTruthy(); - }); - it('CpuDataReceiverTest02 ', function () { - const mockPostMessage = jest.fn(); - global.postMessage = mockPostMessage; - cpuDataReceiver(data, proc); - cpuDataReceiver(data2,proc) - expect(mockPostMessage).toHaveBeenCalledTimes(2); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/CpuFreqDataReceiver.test.ts b/ide/test/trace/database/data-trafic/CpuFreqDataReceiver.test.ts deleted file mode 100644 index f869e5d1..00000000 --- a/ide/test/trace/database/data-trafic/CpuFreqDataReceiver.test.ts +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2022 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 { - chartCpuFreqDataSql, - chartCpuFreqDataSqlMem, cpuFreqDataReceiver -} from '../../../../src/trace/database/data-trafic/CpuFreqDataReceiver'; - -describe('CpuFreqDataReceiver Test',()=>{ - let data; - let proc; - - beforeEach(() => { - data = { - id: "6a41c242-3e3e-4c3f-82f3-eab7102f0e9f", - name: 2, - action: "exec-proto", - params: { - cpu: 0, - startNS: 0, - endNS: 9427688540, - recordStartNS: 4049847357191, - recordEndNS: 4059275045731, - t: 1703754730919, - width: 549, - trafic: 2 - } - }; - proc = jest.fn((sql) => [ - {cpuFreqData: {cpu: 4, value: 826000, dur: 0, startNs: 8252840103}}, - {cpuFreqData: {cpu: 4, value: 826000, dur: 0, startNs: 8252840103}}, - ]); - }); - it('CpuFreqDataReceiverTest01 ', function () { - const args = { - recordStartNS: 1000, - endNS: 3000, - startNS: 2000, - width: 10 - }; - expect(chartCpuFreqDataSql (args)).toBeTruthy(); - expect(chartCpuFreqDataSqlMem (args)).toBeTruthy(); - }); - it('CpuFreqDataReceiverTest02 ', function () { - const mockPostMessage = jest.fn(); - global.postMessage = mockPostMessage; - cpuFreqDataReceiver(data, proc); - expect(mockPostMessage).toHaveBeenCalledTimes(1); - }); -}) \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/CpuFreqDataSender.test.ts b/ide/test/trace/database/data-trafic/CpuFreqDataSender.test.ts deleted file mode 100644 index cfb8d997..00000000 --- a/ide/test/trace/database/data-trafic/CpuFreqDataSender.test.ts +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2022 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 { threadPool } from '../../../../src/trace/database/SqlLite'; -import { TraceRow } from '../../../../src/trace/component/trace/base/TraceRow'; -import { QueryEnum } from '../../../../src/trace/database/data-trafic/QueryEnum'; -import { CpuFreqStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerFreq'; -import { cpuFreqDataSender } from '../../../../src/trace/database/data-trafic/CpuFreqDataSender'; - -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); -describe('CpuFreqDataSender Test', () => { - let CpuFreqData = [{ - cpu: 1, - value: 884000, - dur: -1, - startNS: 9400191145, - frame: { - y: 5, - height: 30, - x: 547, - width: 1 - } - }]; - it('CpuFreqDataSenderTest01 ', function () { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(CpuFreqData, CpuFreqData.length, true); - }); - let cpuFreqDataTraceRow = TraceRow.skeleton(); - cpuFreqDataSender(QueryEnum.CpuData, cpuFreqDataTraceRow).then(res => { - expect(res).toHaveLength(1); - }); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/CpuFreqLimitDataReceiver.test.ts b/ide/test/trace/database/data-trafic/CpuFreqLimitDataReceiver.test.ts deleted file mode 100644 index 495b3dfd..00000000 --- a/ide/test/trace/database/data-trafic/CpuFreqLimitDataReceiver.test.ts +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright (C) 2022 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 { - chartCpuFreqLimitDataSql, - chartCpuFreqLimitDataSqlMem, cpuFreqLimitReceiver -} from '../../../../src/trace/database/data-trafic/CpuFreqLimitDataReceiver'; - -describe('CpuFreqLimitDataReceiver Test', () => { - let data; - let proc; - - beforeEach(() => { - data = { - id: '6a41c242-3e3e-4c3f-82f3-eab7102f0e9f', - name: 2, - action: 'exec-proto', - params: { - cpu: 0, - startNS: 0, - endNS: 9427688540, - recordStartNS: 4049847357191, - recordEndNS: 4059275045731, - t: 1703754730919, - width: 549, - trafic: 2 - } - }; - proc = jest.fn((sql:any) => [ - {cpuFreqLimitData: {cpu: 4, value: 826000, dur: 0, startNs: 8252840103}}, - {cpuFreqLimitData: {cpu: 4, value: 826000, dur: 0, startNs: 8252840103}}, - ]); - }); - it('CpuFreqLimitDataReceiverTest01 ', function () { - const args = { - recordStartNS: 1000, - endNS: 3000, - startNS: 2000, - width: 10 - }; - expect(chartCpuFreqLimitDataSql(args)).toBeTruthy(); - expect(chartCpuFreqLimitDataSqlMem(args)).toBeTruthy(); - }); - it('CpuFreqLimitDataReceiverTest02 ', function () { - const mockPostMessage = jest.fn(); - global.postMessage = mockPostMessage; - cpuFreqLimitReceiver(data, proc); - expect(mockPostMessage).toHaveBeenCalledTimes(1); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/CpuFreqLimitDataSender.test.ts b/ide/test/trace/database/data-trafic/CpuFreqLimitDataSender.test.ts deleted file mode 100644 index 568c9e14..00000000 --- a/ide/test/trace/database/data-trafic/CpuFreqLimitDataSender.test.ts +++ /dev/null @@ -1,50 +0,0 @@ -/* - * Copyright (C) 2022 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 { threadPool } from '../../../../src/trace/database/SqlLite'; -import { TraceRow } from '../../../../src/trace/component/trace/base/TraceRow'; -import { QueryEnum } from '../../../../src/trace/database/data-trafic/QueryEnum'; -import { CpuFreqLimitsStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerCpuFreqLimits'; -import { cpuFreqLimitSender } from '../../../../src/trace/database/data-trafic/CpuFreqLimitDataSender'; - -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); -describe(' CpuFreqLimitDataSender Test', () => { - let CpuFreqLimitData = [{ - cpu: 1, - value: 884000, - dur: -1, - startNS: 9400191145, - frame: { - y: 5, - height: 30, - x: 547, - width: 1 - } - }]; - it(' CpuFreqLimitDataSenderTest01 ', function () { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(CpuFreqLimitData, CpuFreqLimitData.length, true); - }); - let CpuFreqLimitDataTraceRow = TraceRow.skeleton(); - let maxId = 0; - let minId = 0; - let cpu = 1; - cpuFreqLimitSender(maxId,minId,QueryEnum.CpuFreqLimitData, CpuFreqLimitDataTraceRow).then(res => { - expect(res).toHaveLength(1); - }); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/CpuStateReceiver.test.ts b/ide/test/trace/database/data-trafic/CpuStateReceiver.test.ts deleted file mode 100644 index 2d78e0cc..00000000 --- a/ide/test/trace/database/data-trafic/CpuStateReceiver.test.ts +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright (C) 2022 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 { - chartCpuStateDataSql, - chartCpuStateDataSqlMem, cpuStateReceiver -} from '../../../../src/trace/database/data-trafic/CpuStateReceiver'; - -describe('CpuStateReceiver Test', () => { - let data = { - id: '55348b85-5aa9-4e99-86fc-acb2d6f438fe', - name: 1, - action: 'exec-proto', - params: { - startTs: 1, - filterId: 3, - startNS: 0, - endNS: 9427688540, - recordStartNS: 4049847357191, - recordEndNS: 4059275045731, - width: 491, - trafic: 2, - } - }; - let CpuStateData = [{ - value: 0, - dur: 193229, - height: 4, - startTs: 6992644791, - cpu: 1, - frame: { - y: 5, - height: 30, - x: 364, - width: 1 - } - }] - it('CpuStateReceiverTest01 ', function () { - const args = { - recordStartNS: 1000, - endNS: 3000, - startNS: 2000, - width: 10, - filterId: 1, - }; - expect(chartCpuStateDataSql(args)).toBeTruthy(); - expect(chartCpuStateDataSqlMem(args)).toBeTruthy(); - }); - it('CpuStateReceiverTest02 ', function () { - (self as unknown as Worker).postMessage = jest.fn(() => true); - expect(cpuStateReceiver(data, () => { - return CpuStateData; - })).toBeUndefined(); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/CpuStateSender.test.ts b/ide/test/trace/database/data-trafic/CpuStateSender.test.ts deleted file mode 100644 index ced3f794..00000000 --- a/ide/test/trace/database/data-trafic/CpuStateSender.test.ts +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2022 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 { threadPool } from '../../../../src/trace/database/SqlLite'; -import { cpuStateSender } from '../../../../src/trace/database/data-trafic/CpuStateSender'; -import { TraceRow } from '../../../../src/trace/component/trace/base/TraceRow'; -import { CpuStateStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerCpuState'; -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); -describe('CpuStateSender Test', () => { - let cpuStateData = [{ - value: 0, - dur: 193229, - height: 4, - startTs: 6992644791, - cpu: 1, - frame: { - y: 5, - height: 30, - x: 364, - width: 1 - } - }] - it('CpuStateSenderTest01 ', function () { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(cpuStateData, cpuStateData.length, true); - }); - let filterId = 1; - let CpustataDataTraceRow = TraceRow.skeleton(); - cpuStateSender(filterId,CpustataDataTraceRow).then(result => { - expect(result).toHaveLength(1); - }); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/DataFilter.test.ts b/ide/test/trace/database/data-trafic/DataFilter.test.ts deleted file mode 100644 index fc77b5c7..00000000 --- a/ide/test/trace/database/data-trafic/DataFilter.test.ts +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (C) 2022 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 { - filterData, - filterDataByGroup, - filterDataByGroupLayer, - filterDataByLayer -} from '../../../../src/trace/database/data-trafic/DataFilter'; - -describe('DataFilter Test', () => { - it('DataFilterTest01', () => { - let list = [ - {startKey: 0, durKey: 100, startNS: 0, endNS: 1000}, - {startKey: 100, durKey: 200, startNS: 1001, endNS: 2000}, - ]; - let startKey = 'startKey'; - let durKey = 'durKey'; - let startNS = 0; - let endNS = 2000; - let width = 100; - let result = filterData(list, startKey, durKey, startNS, endNS, width); - expect(result).toEqual([ - {startKey: 0, durKey: 100, startNS: 0, endNS: 1000, v: true}, - {startKey: 100, durKey: 200, startNS: 1001, endNS: 2000, v: true}, - ]); - }); - it('DataFilterTest02', () => { - let list = [ - {startKey: 0, durKey: 100, startNS: 0, endNS: 1000}, - {startKey: 100, durKey: 200, startNS: 1001, endNS: 2000}, - ]; - let layerKey = 'layerKey'; - let startKey = 'startKey'; - let durKey = 'durKey'; - let startNS = 0; - let endNS = 2000; - let width = 100; - let result = filterDataByLayer(list, layerKey, startKey, durKey, startNS, endNS, width); - expect(result).toEqual([ - {startKey: 0, durKey: 100, startNS: 0, endNS: 1000, v: true}, - {startKey: 100, durKey: 200, startNS: 1001, endNS: 2000, v: true}, - ]); - }); - it('DataFilterTest03', () => { - let list = [ - {startKey: 0, durKey: 100, startNS: 0, endNS: 1000}, - {startKey: 100, durKey: 200, startNS: 1001, endNS: 2000}, - ]; - let startKey = 'startKey'; - let durKey = 'durKey'; - let startNS = 0; - let endNS = 2000; - let width = 100; - let result = filterDataByGroup(list, startKey, durKey, startNS, endNS, width, null); - expect(result).toEqual([ - {startKey: 0, durKey: 100, startNS: 0, endNS: 1000, px: 0,}, - {startKey: 100, durKey: 200, startNS: 1001, endNS: 2000, px: 5,}, - ]); - }); - it('DataFilterTest0304', () => { - let list = [ - {layerKey: 1, startKey: 0, durKey: 100, startNS: 0, endNS: 1000}, - {layerKey: 2, startKey: 100, durKey: 200, startNS: 1001, endNS: 2000}, - ]; - let layerKey = 'layerKey'; - let startKey = 'startKey'; - let durKey = 'durKey'; - let startNS = 0; - let endNS = 2000; - let width = 100; - let result = filterDataByGroupLayer(list, layerKey, startKey, durKey, startNS, endNS, width); - expect(result).toEqual([ - {startKey: 0, durKey: 100, startNS: 0, endNS: 1000, px: 100, durTmp: undefined, layerKey: 1,}, - {startKey: 100, durKey: 200, startNS: 1001, endNS: 2000, px: 205, durTmp: undefined, layerKey: 2,}, - ]); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/EBPFReceiver.test.ts b/ide/test/trace/database/data-trafic/EBPFReceiver.test.ts deleted file mode 100644 index 566d06af..00000000 --- a/ide/test/trace/database/data-trafic/EBPFReceiver.test.ts +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright (C) 2022 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 { TraficEnum } from '../../../../src/trace/database/data-trafic/QueryEnum'; -import { - diskIoDataGroupBy10MSProtoSql, - diskIoDataProtoSql, - diskIoReceiver, - eBPFVmDataGroupBy10MSProtoSql, - eBPFVmDataProtoSql, - eBPFVmReceiver, - fileSystemDataGroupBy10MSProtoSql, - fileSystemDataProtoSql, - fileSystemDataReceiver -} from '../../../../src/trace/database/data-trafic/EBPFReceiver'; - -describe('EBPFReceiver Test', () => { - let data; - let proc; - - beforeEach(() => { - data = { - params: { - trafic: TraficEnum.ProtoBuffer, - sharedArrayBuffers: { - id: new Uint16Array([1, 2, 3]), - }, - typeArr:[] - }, - }; - proc = jest.fn((sql) => [ - {EBPFVm: {startNs: 440000000, endNs: 450000000, size: 4, px: 172}}, - {EBPFVm: {startNs: 450000000, endNs: 460000000, size: 3, px: 176}}, - ]); - }); - it('EBPFReceiverTest01 ', function () { - const args = { - recordStartNS: 1000, - endNS: 3000, - startNS: 2000, - width: 10, - typeArr:[] - }; - expect(fileSystemDataGroupBy10MSProtoSql(args)).toBeTruthy(); - expect(fileSystemDataProtoSql(args)).toBeTruthy(); - expect(diskIoDataGroupBy10MSProtoSql (args)).toBeTruthy(); - expect(diskIoDataProtoSql (args)).toBeTruthy(); - expect(eBPFVmDataGroupBy10MSProtoSql (args)).toBeTruthy(); - expect(eBPFVmDataProtoSql (args)).toBeTruthy(); - }); - it('EBPFReceiverTest02 ', function () { - const mockPostMessage = jest.fn(); - global.postMessage = mockPostMessage; - fileSystemDataReceiver(data, proc); - expect(mockPostMessage).toHaveBeenCalledTimes(1); - }); - it('EBPFReceiverTest03 ', function () { - const mockPostMessage = jest.fn(); - global.postMessage = mockPostMessage; - diskIoReceiver(data, proc); - expect(mockPostMessage).toHaveBeenCalledTimes(1); - }); - it('EBPFReceiverTest04 ', function () { - const mockPostMessage = jest.fn(); - global.postMessage = mockPostMessage; - eBPFVmReceiver(data, proc); - expect(mockPostMessage).toHaveBeenCalledTimes(1); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/EBPFSender.test.ts b/ide/test/trace/database/data-trafic/EBPFSender.test.ts deleted file mode 100644 index dd28322d..00000000 --- a/ide/test/trace/database/data-trafic/EBPFSender.test.ts +++ /dev/null @@ -1,77 +0,0 @@ -/* - * Copyright (C) 2022 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 { threadPool } from '../../../../src/trace/database/SqlLite'; -import { TraceRow } from '../../../../src/trace/component/trace/base/TraceRow'; -import { EBPFChartStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerEBPF'; -import { - diskIoSender, - fileSystemSender, - fileSysVMSender -} from '../../../../src/trace/database/data-trafic/EBPFSender.js'; - -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); -describe('EBPFSender Test', () => { - let EBPFData = [{ - size: 3, - dur: null, - endNS: 1070000000, - startNS: 1060000000, - height: 1, - frame: { - y: 0, - height: 1, - x: 403, - width: 4 - }, - group10Ms: true, - }]; - it('EBPFSenderTest01 ', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(EBPFData, EBPFData.length, true); - }); - let type = 1; - let scale = 1; - let fileSystemTraceRow = TraceRow.skeleton(); - fileSystemSender(type, scale, fileSystemTraceRow).then(result => { - expect(result).toHaveLength(1); - }); - }); - it('EBPFSenderTest02 ', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(EBPFData, EBPFData.length, true); - }); - let scale = 1; - let all = true; - let ipid = 5; - let typeArr = [1, 2, 3, 4]; - let DiskIoDataTraceRow = TraceRow.skeleton(); - diskIoSender(all, ipid, typeArr, scale, DiskIoDataTraceRow).then(res => { - expect(res).toHaveLength(1); - }); - }); - it('EBPFSenderTest03 ', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(EBPFData, EBPFData.length, true); - }); - let scale = 1; - let DiskIoDataTraceRow = TraceRow.skeleton(); - fileSysVMSender(scale, DiskIoDataTraceRow).then(res => { - expect(res).toHaveLength(1); - }); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/EnergySysEventReceiver.test.ts b/ide/test/trace/database/data-trafic/EnergySysEventReceiver.test.ts deleted file mode 100644 index f602032e..00000000 --- a/ide/test/trace/database/data-trafic/EnergySysEventReceiver.test.ts +++ /dev/null @@ -1,226 +0,0 @@ -/* - * Copyright (C) 2022 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 { - systemDataSql, - chartEnergyAnomalyDataSql, - queryPowerValueSql, - queryStateDataSql, - queryStateProtoDataSql, - energySysEventReceiver, - hiSysEnergyAnomalyDataReceiver, - hiSysEnergyStateReceiver, - hiSysEnergyPowerReceiver -} from '../../../../src/trace/database/data-trafic/EnergySysEventReceiver'; -import { TraficEnum } from '../../../../src/trace/database/data-trafic/QueryEnum'; - -describe('EnergySysEventReceiver Test', () => { - let data; - let proc; - beforeEach(() => { - data = { - params: { - trafic: TraficEnum.ProtoBuffer, - sharedArrayBuffers: { - id: new Uint16Array([1, 2, 3]), - }, - }, - }; - proc = jest.fn((sql) => [ - {energyData: {id: 1, startNs: 4.4, eventName: '', appKey: '', eventValue: ''}}, - {energyData: {id: 2, startNs: 5.5, eventName: '', appKey: '', eventValue: ''}}, - {energyData: {id: 3, startNs: 5.5, eventName: '', appKey: '', eventValue: ''}}, - {energyData: {id: 4, startNs: 5.5, eventName: '', appKey: '', eventValue: ''}}, - {energyData: {id: 5, startNs: 5.5, eventName: '', appKey: '', eventValue: ''}}, - ]); - }); - it('EnergySysEventReceiverTest01', () => { - let args = { - recordStartNS: 1000, - endNS: 3000, - startNS: 2000, - width: 10 - }; - expect(systemDataSql(args)).toBeTruthy(); - expect(chartEnergyAnomalyDataSql(args)).toBeTruthy(); - expect(queryPowerValueSql(args)).toBeTruthy(); - expect(queryStateDataSql(args)).toBeTruthy(); - expect(queryStateProtoDataSql(args)).toBeTruthy(); - }); - it('EnergySysEventReceiverTest02', () => { - let mockPostMessage = jest.fn(); - global.postMessage = mockPostMessage; - hiSysEnergyAnomalyDataReceiver(data, proc); - hiSysEnergyPowerReceiver(data, proc); - hiSysEnergyStateReceiver(data, proc); - expect(mockPostMessage).toHaveBeenCalledTimes(3); - }); - it('EnergySysEventReceiverTest03', () => { - let systemData = { - params: { - trafic: TraficEnum.ProtoBuffer, - sharedArrayBuffers: { - id: new Uint16Array([1, 2, 3]), - }, - }, - }; - let systemEventvalue = { - 'LOG_LEVEL': 2, - 'MESSAGE': 'token=548210734912', - 'NAME': 'backGround', - 'PID': 4192, - 'STATE': 1, - 'TAG': 'DUBAI_TAG_RUNNINGLOCK_ADD', - 'TYPE': 1, - 'UID': 20010034 - }; - let systemEventvalueJson = JSON.stringify(systemEventvalue); - let systemProc = jest.fn((sql) => [ - { - energyData: { - id: 1, - startNs: 4.4, - eventName: 'POWER_RUNNINGLOCK', - appKey: '1', - eventValue: systemEventvalueJson - } - }, - ]); - let mockPostMessage = jest.fn(); - global.postMessage = mockPostMessage; - energySysEventReceiver(systemData, systemProc); - expect(mockPostMessage).toHaveBeenCalledTimes(1); - }); - it('EnergySysEventReceiverTest04', () => { - let systemData = { - params: { - trafic: TraficEnum.ProtoBuffer, - sharedArrayBuffers: { - id: new Uint16Array([1, 2, 3]), - }, - }, - }; - let systemEventvalue = { - 'LOG_LEVEL': 2, - 'MESSAGE': 'token=548210734912', - 'NAME': 'backGround', - 'PID': 4192, - 'STATE': 1, - 'TAG': 'DUBAI_TAG_RUNNINGLOCK', - 'TYPE': 1, - 'UID': 20010034 - }; - let systemEventvalueJson = JSON.stringify(systemEventvalue); - let systemProc = jest.fn((sql) => [ - { - energyData: { - id: 1, - startNs: 4.4, - eventName: 'POWER_RUNNINGLOCK', - appKey: '1', - eventValue: systemEventvalueJson - } - }, - ]); - let mockPostMessage = jest.fn(); - global.postMessage = mockPostMessage; - energySysEventReceiver(systemData, systemProc); - expect(mockPostMessage).toHaveBeenCalledTimes(1); - }); - it('EnergySysEventReceiverTest05', () => { - let systemData = { - params: { - trafic: TraficEnum.ProtoBuffer, - sharedArrayBuffers: { - id: new Uint16Array([1, 2, 3]), - }, - }, - }; - let systemEventvalue = { - 'LOG_LEVEL': 2, - 'MESSAGE': 'token=548210734912', - 'NAME': 'backGround', - 'PID': 4192, - 'STATE': 'stop', - 'TAG': 'DUBAI_TAG_RUNNINGLOCK', - 'TYPE': 1, - 'UID': 20010034 - }; - let systemEventvalueJson = JSON.stringify(systemEventvalue); - let systemProc = jest.fn((sql) => [ - {energyData: {id: 1, startNs: 4.4, eventName: 'GNSS_STATE', appKey: '1', eventValue: systemEventvalueJson}}, - ]); - let mockPostMessage = jest.fn(); - global.postMessage = mockPostMessage; - energySysEventReceiver(systemData, systemProc); - expect(mockPostMessage).toHaveBeenCalledTimes(1); - }); - it('EnergySysEventReceiverTest06', () => { - let systemData = { - params: { - trafic: TraficEnum.ProtoBuffer, - sharedArrayBuffers: { - id: new Uint16Array([1, 2, 3]), - }, - }, - }; - let systemEventvalue = { - 'LOG_LEVEL': 2, - 'MESSAGE': 'token=548210734912', - 'NAME': 'backGround', - 'PID': 4192, - 'STATE': 'stop', - 'TAG': 'DUBAI_TAG_RUNNINGLOCK', - 'TYPE': 1, - 'UID': 20010034 - }; - let systemEventvalueJson = JSON.stringify(systemEventvalue); - let systemProc = jest.fn((sql) => [ - {energyData: {id: 1, startNs: 4.4, eventName: 'GNSS_STATE', appKey: '1', eventValue: systemEventvalueJson}}, - ]); - let mockPostMessage = jest.fn(); - global.postMessage = mockPostMessage; - energySysEventReceiver(systemData, systemProc); - expect(mockPostMessage).toHaveBeenCalledTimes(1); - }); - it('EnergySysEventReceiverTest07', () => { - let systemData = { - params: { - trafic: TraficEnum.ProtoBuffer, - sharedArrayBuffers: { - id: new Uint16Array([1, 2, 3]), - }, - }, - }; - let systemEventvalue = { - 'LOG_LEVEL': 2, - 'MESSAGE': 'token=548210734912', - 'NAME': 'WORK_START', - 'PID': 4192, - 'STATE': 'stop', - 'TAG': 'DUBAI_TAG_RUNNINGLOCK', - 'TYPE': 1, - 'UID': 20010034 - }; - let systemEventvalueJson = JSON.stringify(systemEventvalue); - let systemProc = jest.fn((sql) => [ - {energyData: {id: 1, startNs: 4.4, eventName: 'WORK_START', appKey: '1', eventValue: systemEventvalueJson}}, - ]); - let mockPostMessage = jest.fn(); - global.postMessage = mockPostMessage; - energySysEventReceiver(systemData, systemProc); - expect(mockPostMessage).toHaveBeenCalledTimes(1); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/EnergySysEventSender.test.ts b/ide/test/trace/database/data-trafic/EnergySysEventSender.test.ts deleted file mode 100644 index 6a1ad269..00000000 --- a/ide/test/trace/database/data-trafic/EnergySysEventSender.test.ts +++ /dev/null @@ -1,119 +0,0 @@ -/* - * Copyright (C) 2022 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 { TraceRow } from '../../../../src/trace/component/trace/base/TraceRow'; -import { - energySysEventSender, - hiSysEnergyAnomalyDataSender, - hiSysEnergyPowerSender, - hiSysEnergyStateSender -} from '../../../../src/trace/database/data-trafic/EnergySysEventSender'; -import { EnergySystemStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerEnergySystem'; -import { threadPool } from '../../../../src/trace/database/SqlLite'; -import { EnergyAnomalyStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerEnergyAnomaly'; -import { EnergyPowerStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerEnergyPower'; -import { EnergyStateStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerEnergyState'; - -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); - -describe('EnergySysEventSender Test', () => { - let systemData = [{ - count: 2, - dataType: 1, - dur: 1320000, - frame: - {x: 70, y: 45, width: 11, height: 10}, - id: 73, - startNs: 8930000, - token: 546680714, - type: 1 - }] - - let anomalyData = [ - { - id: 126, - startNs: 2384000000, - eventName: "ANOMALY_SCREEN_OFF_ENERGY", - appKey: "APPNAME", - eventValue: "bt_switch" - }, - { - id: 127, - startNs: 2385000000, - eventName: "ANOMALY_SCREEN_OFF_ENERGY", - appKey: "APPNAME", - eventValue: "bt_switch" - }] - - let powerData = [{ - appKey: "APPNAME", - eventName: "POWER_IDE_BLUETOOTH", - eventValue: "bt_switch", - id: 8940, - startNS: 111015000000 - }] - - let stateData = [{ - dur: 3000000, - frame: {x: 394, y: 5, width: 1, height: 30}, - id: 5807, - startNs: 49686000000, - type: "WIFI_EVENT_RECEIVED", - value: 4 - }] - - it('EnergySysEventSenderTest01', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(systemData, systemData.length, true); - }); - let systemTraceRow = TraceRow.skeleton(); - energySysEventSender(systemTraceRow).then(result => { - expect(result).toHaveLength(1); - }) - }); - - it('EnergySysEventSenderTest02', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(anomalyData, anomalyData.length, true); - }); - let anomalyTraceRow = TraceRow.skeleton(); - hiSysEnergyAnomalyDataSender(anomalyTraceRow).then(result => { - expect(result).toHaveLength(2); - }) - }); - - it('EnergySysEventSenderTest03', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(powerData, powerData.length, true); - }); - let powerTraceRow = TraceRow.skeleton(); - hiSysEnergyPowerSender(powerTraceRow).then(result => { - expect(Array.isArray(result)).toBe(true); - }) - }); - - it('EnergySysEventSenderTest04', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(stateData, stateData.length, true); - }); - let eventName = ['WIFI_EVENT_RECEIVED']; - let stateTraceRow = TraceRow.skeleton(); - hiSysEnergyStateSender(eventName, 0, stateTraceRow).then(result => { - expect(result).toHaveLength(1); - }) - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/FrameDynamicEffectReceiver.test.ts b/ide/test/trace/database/data-trafic/FrameDynamicEffectReceiver.test.ts deleted file mode 100644 index f9a60e8d..00000000 --- a/ide/test/trace/database/data-trafic/FrameDynamicEffectReceiver.test.ts +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (C) 2022 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 { - frameAnimationReceiver, - frameDynamicReceiver, - frameSpacingReceiver -} from '../../../../src/trace/database/data-trafic/FrameDynamicEffectReceiver'; - -describe('FrameDynamicEffectReceiver Test', () => { - let data = { - action: "exec-proto", - id: "1", - name: 18, - params: { - recordStartNS: 4049847357191, - recordEndNS: 4059275045731, - startNS: 0, - t: 1703474011224, - width: 1407, - trafic: 3 - } - }; - let animationData = [{ - frameAnimationData: { - depth: 0, - dur: 79379165, - endTs: 1451353646, - name: "H:APP_LIST_FLING, com.tencent.mm", - startTs: 1371974481 - } - }] - let dynamicData = [{ - frameDynamicData: { - alpha: "0.08", - appName: "WindowScene_mm37", - height: "1119", - ts: 179994792, - width: "543", - x: "513", - y: "1017" - } - }, { - frameDynamicData: { - alpha: "0.26", - appName: "WindowScene_mm37", - height: "1293", - ts: 196844792, - width: "627", - x: "459", - y: "938" - } - }] - let frameSpacingData = [{ - frameSpacingData: { - currentFrameHeight: "1119", - currentFrameWidth: "543", - currentTs: 179994792, - frameSpacingResult: 0, - nameId: "WindowScene_mm37", - preFrameHeight: 0, - preFrameWidth: 0, - preTs: 0, - preX: 0, - preY: 0, - x: "513", - y: "1017" - } - }] - it('FrameDynamicEffectReceiverTest01', function () { - const mockCallback = jest.fn(() => animationData); - const mockPostMessage = jest.fn(); - (self as unknown as Worker).postMessage = mockPostMessage; - frameAnimationReceiver(data, mockCallback); - expect(mockCallback).toHaveBeenCalled(); - }); - - it('FrameDynamicEffectReceiverTest02', function () { - const mockCallback = jest.fn(() => dynamicData); - const mockPostMessage = jest.fn(); - (self as unknown as Worker).postMessage = mockPostMessage; - frameDynamicReceiver(data, mockCallback); - expect(mockCallback).toHaveBeenCalled(); - }); - it('FrameDynamicEffectReceiverTest03', function () { - let mockCallback = jest.fn(() => frameSpacingData); - (self as unknown as Worker).postMessage = jest.fn(); - frameSpacingReceiver(data, mockCallback); - expect(mockCallback).toHaveBeenCalled(); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/FrameDynamicEffectSender.test.ts b/ide/test/trace/database/data-trafic/FrameDynamicEffectSender.test.ts deleted file mode 100644 index bcb780fa..00000000 --- a/ide/test/trace/database/data-trafic/FrameDynamicEffectSender.test.ts +++ /dev/null @@ -1,121 +0,0 @@ -/* - * Copyright (C) 2022 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 { threadPool } from '../../../../src/trace/database/SqlLite'; -import { FrameAnimationStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerFrameAnimation'; -import { TraceRow } from '../../../../src/trace/component/trace/base/TraceRow'; -import { - frameAnimationSender, - frameDynamicSender, - frameSpacingSender -} from '../../../../src/trace/database/data-trafic/FrameDynamicEffectSender'; -import { FrameDynamicStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerFrameDynamic'; -import { FrameSpacingStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerFrameSpacing'; - -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); - -describe('FrameDynamicEffectSender Test', () => { - let animationData = [ - { - animationId: 0, - depth: 0, - dur: 79379165, - endTs: 1451353646, - frame: {x: 204, y: 2, width: 12, height: 16}, - frameInfo: "0", - name: "H:APP_LIST_FLING, com.tencent.mm", - startTs: 1371974481, - status: "Response delay", - textMetricsWidth: 120.1328125 - }, - { - animationId: 0, - depth: 1, - dur: 2606938539, - endTs: 3978913020, - frame: {x: 204, y: 22, width: 389, height: 16}, - frameInfo: "0:89.55", - name: "H:APP_LIST_FLING, com.tencent.mm", - startTs: 1371974481, - status: "Completion delay", - textMetricsWidth: 137.76171875 - }] - - let dynamicCurveData = [{ - alpha: 1, - appName: "WindowScene_mm37", - frame: {x: 295, y: 97, width: 0, height: 100}, - groupId: 1371974481, - height: 2772, - id: 100, - ts: 1979229687, - typeValue: 0, - width: 1344, - x: 0, - y: 0 - }] - - let frameSpacingData = [{ - currentFrameHeight: 2772, - currentFrameWidth: 1344, - currentTs: 3295268229, - frame: {x: 491, y: 137, width: 0, height: 0}, - frameSpacingResult: 0, - groupId: 1371974481, - id: 218, - nameId: "WindowScene_mm37", - physicalHeight: 2772, - physicalWidth: 1344, - preFrameHeight: 2772, - preFrameWidth: 1344, - preTs: 3281170312, - preX: 0, - preY: 0, - x: 0, - y: 0 - }] - it('FrameDynamicEffectSenderTest01', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(animationData, animationData.length, true); - }); - let animationTraceRow = TraceRow.skeleton(); - frameAnimationSender(animationTraceRow).then(result => { - expect(result).toHaveLength(2); - }); - }); - - it('FrameDynamicEffectSenderTest02', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(dynamicCurveData, dynamicCurveData.length, true); - }); - let frameDynamicTraceRow = TraceRow.skeleton(); - frameDynamicSender(frameDynamicTraceRow).then(result => { - expect(result).toHaveLength(1); - }); - }); - - it('FrameDynamicEffectSenderTest03', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(frameSpacingData, frameSpacingData.length, true); - }); - let frameSpacingTraceRow = TraceRow.skeleton(); - frameSpacingSender(1255, 5255, frameSpacingTraceRow).then(result => { - expect(result).toHaveLength(1); - expect(Array.isArray(result)).toBe(true); - }); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/FrameJanksReceiver.test.ts b/ide/test/trace/database/data-trafic/FrameJanksReceiver.test.ts deleted file mode 100644 index 659a6a1e..00000000 --- a/ide/test/trace/database/data-trafic/FrameJanksReceiver.test.ts +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright (C) 2022 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 { - frameActualReceiver, - frameExpectedReceiver -} from "../../../../src/trace/database/data-trafic/FrameJanksReceiver"; - -describe('FrameJanksReceiver Test', () => { - let data = { - action: "exec-proto", - id: "5", - name: 16, - params: { - endNS: 8711323000, - queryEnum: 16, - recordEndNS: 512261248000, - recordStartNS: 503549925000, - sharedArrayBuffers: undefined, - startNS: 0, - t: 1703484466189, - trafic: 3, - width: 1407 - } - } - - let expectData = { - frameData: { - appDur: 16634548, - cmdline: "com.huawei.wx", - depth: 2, - dur: 33269438, - frameType: "frameTime", - id: 1007, - ipid: 135, - jankTag: -1, - name: 2299, - pid: 3104, - rsDur: 16634548, - rsIpid: 15, - rsPid: 994, - rsTs: 4996898311, - rsVsync: 1279, - ts: 4980263421, - type: "1" - } - } - - let actualData = { - frameData: { - appDur: 1697000, - cmdline: "com.ohos.launch", - depth: 0, - dur: 24662000, - frameType: "frameTime", - id: 918, - ipid: 19, - name: 2280, - pid: 2128, - rsDur: 11082000, - rsIpid: 15, - rsPid: 994, - rsTs: 4681218000, - rsVsync: 1260, - ts: 4667638000, - type: "0" - } - } - it('FrameJanksReceiverTest01', function () { - (self as unknown as Worker).postMessage = jest.fn(() => true); - expect(frameExpectedReceiver(data, () => { - return expectData; - })).toBeUndefined(); - }); - - it('FrameJanksReceiverTest02', function () { - (self as unknown as Worker).postMessage = jest.fn(() => true); - expect(frameActualReceiver(data, () => { - return actualData; - })).toBeUndefined(); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/FrameJanksSender.test.ts b/ide/test/trace/database/data-trafic/FrameJanksSender.test.ts deleted file mode 100644 index b0f75a74..00000000 --- a/ide/test/trace/database/data-trafic/FrameJanksSender.test.ts +++ /dev/null @@ -1,90 +0,0 @@ -/* - * Copyright (C) 2022 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 { threadPool } from '../../../../src/trace/database/SqlLite'; -import { frameJanksSender } from '../../../../src/trace/database/data-trafic/FrameJanksSender'; -import { TraceRow } from '../../../../src/trace/component/trace/base/TraceRow'; -import { QueryEnum } from '../../../../src/trace/database/data-trafic/QueryEnum'; -import { JanksStruct } from '../../../../src/trace/bean/JanksStruct'; - -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); - -describe('FrameJanksSender Test', () => { - let expectedData = [{ - app_dur: 16603333, - cmdline: "com.ohos.launch", - depth: 0, - dur: 16603333, - frame: {x: 167, y: 0, width: 3, height: 20}, - frame_type: "frameTime", - id: 157, - ipid: 19, - jank_tag: 65535, - name: 2087, - pid: 2128, - rs_dur: 16603333, - rs_ipid: 15, - rs_name: "swapper", - rs_pid: 994, - rs_ts: 1038812193, - rs_vsync: 1080, - ts: 1038812193 - }] - - let actualData = [{ - app_dur: 3403000, - cmdline: "com.ohos.launch", - depth: 0, - dur: 17569000, - frame: {x: 739, y: 0, width: 3, height: 20}, - frame_type: "frameTime", - id: 898, - ipid: 19, - jank_tag: 0, - name: 2275, - pid: 2128, - rs_dur: 1192000, - rs_ipid: 15, - rs_name: "swapper", - rs_pid: 994, - rs_ts: 4598062000, - rs_vsync: 1255, - ts: 4581685000, - type: "0" - }] - - it('FrameJanksSenderTest01', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(expectedData, expectedData.length, true); - }); - let expectedTraceRow = TraceRow.skeleton(); - frameJanksSender(QueryEnum.FrameExpectedData, expectedTraceRow).then(result => { - expect(result).toHaveLength(1); - }); - }); - - it('FrameJanksSenderTest02', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(actualData, actualData.length, true); - }); - let actualTraceRow = TraceRow.skeleton(); - frameJanksSender(QueryEnum.FrameActualData, actualTraceRow).then(result => { - expect(result).toHaveLength(1); - expect(Array.isArray(result)).toBe(true); - }); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/FuncDataReceiver.test.ts b/ide/test/trace/database/data-trafic/FuncDataReceiver.test.ts deleted file mode 100644 index a4c559c2..00000000 --- a/ide/test/trace/database/data-trafic/FuncDataReceiver.test.ts +++ /dev/null @@ -1,83 +0,0 @@ -/* - * Copyright (C) 2022 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 { - chartFuncDataSql, - chartFuncDataSqlMem, - funcDataReceiver -} from '../../../../src/trace/database/data-trafic/FuncDataReceiver'; - -describe('FuncDataReceiver Test', () => { - let data; - let proc; - - beforeEach(() => { - data = { - id: '55febc1a-1eea-4c9f-ad29-33cd10b95b39', - name: 31, - action: 'exec-proto', - params: { - tid: 8182, - ipid: 52, - startNS: 0, - endNS: 9427688540, - recordStartNS: 4049847357191, - recordEndNS: 4059275045731, - width: 549, - trafic: 0 - } - }; - proc = jest.fn((sql: any) => [ - { - FuncData: { - startTs: 129966146, - dur: 0, - argsetid: 2128, - depth: 0, - id: 1090, - px: 7, - durTmp: 0 - } - }, - { - FuncData: { - startTs: 155282292, - dur: 0, - argsetid: 3260, - depth: 0, - id: 1778, - px: 9, - durTmp: 0 - } - }, - ]); - }); - it('FuncDataReceiverTest01 ', function () { - const args = { - recordStartNS: 1000, - endNS: 3000, - startNS: 2000, - width: 10 - }; - expect(chartFuncDataSql(args)).toBeTruthy(); - expect(chartFuncDataSqlMem(args)).toBeTruthy(); - }); - it('FuncDataReceiverTest02 ', function () { - const mockPostMessage = jest.fn(); - global.postMessage = mockPostMessage; - funcDataReceiver(data, proc); - expect(mockPostMessage).toHaveBeenCalledTimes(1); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/FuncDataSender.test.ts b/ide/test/trace/database/data-trafic/FuncDataSender.test.ts deleted file mode 100644 index 4fb17a43..00000000 --- a/ide/test/trace/database/data-trafic/FuncDataSender.test.ts +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright (C) 2022 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 { threadPool } from '../../../../src/trace/database/SqlLite'; -import { TraceRow } from '../../../../src/trace/component/trace/base/TraceRow'; -import { FuncStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerFunc'; -import { funcDataSender } from '../../../../src/trace/database/data-trafic/FuncDataSender'; -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); -describe('FuncDataSender Test',()=>{ - let FuncData = [{ - startTs: 111552604, - dur: 0, - argsetid: 1462, - depth: 0, - id: 633, - itid: 120, - ipid: 52, - funName: "binder transaction async", - frame: { - x: 6, - y: 0, - width: 1, - height: 20 - } - }] - it('FuncDataSenderTest01 ', function () { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(FuncData, FuncData.length, true); - }); - let tid = 1; - let ipid = 52; - let FuncDataTraceRow = TraceRow.skeleton(); - funcDataSender(tid,ipid,FuncDataTraceRow).then(res=>{ - expect(res).toHaveLength(1); - }) - }); -}) \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/HiSysEventDataReciver.test.ts b/ide/test/trace/database/data-trafic/HiSysEventDataReciver.test.ts deleted file mode 100644 index 442030e2..00000000 --- a/ide/test/trace/database/data-trafic/HiSysEventDataReciver.test.ts +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2022 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 { - hiSysEventDataReceiver, - chartHiSysEventDataSql -} from '../../../../src/trace/database/data-trafic/HiSysEventDataReceiver'; -import { TraficEnum } from '../../../../src/trace/database/data-trafic/QueryEnum'; - -describe('hiSysEventDataReceiver Test', () => { - let data; - let proc; - - beforeEach(() => { - data = { - params: { - trafic: TraficEnum.ProtoBuffer, - sharedArrayBuffers: { - id: new Uint16Array([1, 2, 3]), - }, - }, - }; - proc = jest.fn((sql) => [ - {hiSysEventData: {id: 4, ts: 4.4, pid: 40, tid: 400, seq: 0.4, uid: 4000, dur: 40000, depth: 4}}, - {hiSysEventData: {id: 5, ts: 5.5, pid: 50, tid: 500, seq: 0.5, uid: 5000, dur: 50000, depth: 5}}, - ]); - }); - it('hiSysEventDataReceiverTest01', () => { - const args = { - recordStartNS: 1000, - endNS: 3000, - startNS: 2000, - width: 10 - }; - expect(chartHiSysEventDataSql(args)).toBeTruthy(); - }); - it('hiSysEventDataReceiverTest02', () => { - const mockPostMessage = jest.fn(); - global.postMessage = mockPostMessage; - hiSysEventDataReceiver(data, proc); - expect(mockPostMessage).toHaveBeenCalledTimes(1); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/HiSysEventDataSender.test.ts b/ide/test/trace/database/data-trafic/HiSysEventDataSender.test.ts deleted file mode 100644 index 5a38e988..00000000 --- a/ide/test/trace/database/data-trafic/HiSysEventDataSender.test.ts +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2022 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 { threadPool } from '../../../../src/trace/database/SqlLite'; -import { TraceRow } from '../../../../src/trace/component/trace/base/TraceRow'; -import { QueryEnum } from '../../../../src/trace/database/data-trafic/QueryEnum'; -import { HiSysEventStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerHiSysEvent'; -import { hiSysEventDataSender } from '../../../../src/trace/database/data-trafic/HiSysEventDataSender'; - -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); -describe('hiSysEventDataSender Test', () => { - let hiSysEventData = [{ - id: 808, - ts: 78977000000, - pid: 491, - tid: 2591, - uid: 6696, - dur: 1, - depth: 0, - seq: -1, - domain: 'MULTIMODALINPUT', - eventName: 'TARGET_POINTER_EVENT_SUCCESS', - info: '', - level: 'MINOR', - contents: '{"AGENT_WINDOWID":16,"EVENTTYPE":131072,"FD":33,"MSG":"The window manager successfully update target pointer","PID":4192,"TARGET_WINDOWID":16}', - frame: { - y: 10, - height: 20, - x: 168, - width: 1 - }, - v: true - }]; - it('hiSysEventDataSenderTest01', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(hiSysEventData, hiSysEventData.length, true); - }); - let hiSysEventTraceRow = TraceRow.skeleton(); - hiSysEventDataSender(QueryEnum.HiSysEventData, hiSysEventTraceRow).then(result => { - expect(result).toHaveLength(1); - }); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/HiperfCallChartReceiver.test.ts b/ide/test/trace/database/data-trafic/HiperfCallChartReceiver.test.ts deleted file mode 100644 index 5b7e18ee..00000000 --- a/ide/test/trace/database/data-trafic/HiperfCallChartReceiver.test.ts +++ /dev/null @@ -1,73 +0,0 @@ -// Copyright (c) 2021 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 { TraficEnum } from '../../../../src/trace/database/data-trafic/QueryEnum'; -import { - chartHiperfCallChartDataSql, - hiPerfCallChartDataHandler, hiPerfCallStackCacheHandler -} from '../../../../src/trace/database/data-trafic/HiperfCallChartReceiver'; - -describe('HiperfCallChartReceiver Test', () => { - let data; - let proc; - let data2; - beforeEach(() => { - data = { - id: "817fccf0-76a8-41f3-86d6-6282b1208b58", - name: 203, - action: "exec-proto", - params: { - recordStartNS: 1395573006744, - trafic: 2, - isCache: true - } - }; - data2 = { - id: "817fccf0-76a8-41f3-86d6-6282b1208b58", - name: 203, - action: "exec-proto", - params: { - recordStartNS: 1395573006744, - trafic: 2, - isCache: false - } - }; - proc = jest.fn((sql) => [ - {HiperfCallChartData: {callchainId: 4, startTs: 4.4, eventCount: 40, threadId: 400, cpuId: 40000, eventTypeId: 4}}, - {HiperfCallChartData: {callchainId: 5, startTs: 5.5, eventCount: 50, threadId: 500, cpuId: 50000, eventTypeId: 5}}, - ]); - }); - it('HiperfCallChartReceiver01', function () { - const args = { - recordStartNS: 1000, - endNS: 3000, - startNS: 2000, - width: 10 - }; - expect(chartHiperfCallChartDataSql(args)).toBeTruthy(); - }); - it('HiperfCallChartReceiver02', () => { - const mockPostMessage = jest.fn(); - global.postMessage = mockPostMessage; - hiPerfCallChartDataHandler(data, proc); - hiPerfCallChartDataHandler(data2, proc); - expect(mockPostMessage).toHaveBeenCalledTimes(1); - }); - it('HiperfCallChartReceiver03', () => { - const mockPostMessage = jest.fn(); - global.postMessage = mockPostMessage; - hiPerfCallStackCacheHandler(data, proc); - hiPerfCallStackCacheHandler(data2, proc); - expect(mockPostMessage).toHaveBeenCalledTimes(1); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/HiperfCpuDataReceiver.test.ts b/ide/test/trace/database/data-trafic/HiperfCpuDataReceiver.test.ts deleted file mode 100644 index 0437a8ac..00000000 --- a/ide/test/trace/database/data-trafic/HiperfCpuDataReceiver.test.ts +++ /dev/null @@ -1,65 +0,0 @@ -/* - * Copyright (C) 2022 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 { - chartHiperfCpuData10MSProtoSql, - chartHiperfCpuDataProtoSql, hiperfCpuDataReceiver -} from '../../../../src/trace/database/data-trafic/HiperfCpuDataReceiver'; - -describe(' HiperfCpuDataReceiver Test', () => { - let data; - let proc; - - beforeEach(() => { - data = { - id: '87cc16a3-5dc7-4202-9ac9-4f038b2979ee', - name: 200, - action: 'exec-proto', - params: { - cpu: -1, - scale: 2000000000, - maxCpuCount: 4, - drawType: -2, - intervalPerf: 1, - startNS: 0, - endNS: 30230251246, - recordStartNS: 1596201782236, - recordEndNS: 1626432033482, - width: 549, - trafic: 3 - } - }; - proc = jest.fn((sql: any) => [ - {hiperfData: {startNs: 5600000000, eventCount: 58513886, sampleCount: 42, callchainId: 2279}}, - {hiperfData: {startNs: 5630000000, eventCount: 60359281, sampleCount: 36, callchainId: 5147}} - ]); - }); - it('HiperfCpuDataReceiverTest01 ', function () { - const args = { - recordStartNS: 1000, - endNS: 3000, - startNS: 2000, - width: 10 - }; - expect(chartHiperfCpuData10MSProtoSql(args)).toBeTruthy(); - expect(chartHiperfCpuDataProtoSql(args)).toBeTruthy(); - }); - it('HiperfCpuDataReceiverTest02 ', function () { - const mockPostMessage = jest.fn(); - global.postMessage = mockPostMessage; - hiperfCpuDataReceiver(data, proc); - expect(mockPostMessage).toHaveBeenCalledTimes(1); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/HiperfCpuDataSender.test.ts b/ide/test/trace/database/data-trafic/HiperfCpuDataSender.test.ts deleted file mode 100644 index 4f0c84b5..00000000 --- a/ide/test/trace/database/data-trafic/HiperfCpuDataSender.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2022 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 { threadPool } from '../../../../src/trace/database/SqlLite'; -import { TraceRow } from '../../../../src/trace/component/trace/base/TraceRow'; -import { HiPerfCpuStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerHiPerfCPU'; -import { hiperfCpuDataSender } from '../../../../src/trace/database/data-trafic/HiperfCpuDataSender'; -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); -describe('HiperfCpuDataSender Test',()=>{ - let HiperfCpuData = [{ - startNS: 0, - eventCount: 26655990, - sampleCount: 63, - event_type_id: 0, - callchain_id: 3, - height: 63, - dur: 10000000, - frame: { - y: 0, - height: 63, - x: 0, - width: 1 - } - }] - it('HiperfCpuDataTest01 ', function () { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(HiperfCpuData, HiperfCpuData.length, true); - }); - let cpu = -1; - let drawType = -2; - let maxCpuCount = 4; - let intervalPerf = 1; - let scale = 2000000000; - let HiperfCpuDataTraceRow = TraceRow.skeleton(); - hiperfCpuDataSender(cpu,drawType,maxCpuCount,intervalPerf,scale,HiperfCpuDataTraceRow).then(res => { - expect(res).toHaveLength(1); - }); - }); -}) - diff --git a/ide/test/trace/database/data-trafic/HiperfProcessDataReceiver.test.ts b/ide/test/trace/database/data-trafic/HiperfProcessDataReceiver.test.ts deleted file mode 100644 index 02c6103b..00000000 --- a/ide/test/trace/database/data-trafic/HiperfProcessDataReceiver.test.ts +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (C) 2022 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 { TraficEnum } from '../../../../src/trace/database/data-trafic/QueryEnum'; -import { - chartHiperfProcessData10MSProtoSql, - chartHiperfProcessDataProtoSql, - hiperfProcessDataReceiver, -} from '../../../../src/trace/database/data-trafic/HiperfProcessDataReceiver'; - -describe('HiperfProcess Test', () => { - let data1; - let data2; - let proc1; - let proc2; - - beforeEach(() => { - data1 = { - params: { - trafic: TraficEnum.ProtoBuffer, - sharedArrayBuffers: {}, - drawType: -2, - endNS: 49171193732, - intervalPerf: 1, - maxCpuCount: -1, - pid: 11, - recordEndNS: 30418971157414, - recordStartNS: 30369799963682, - scale: 2000000000, - startNS: 0, - width: 1407, - }, - }; - data2 = { - params: { - trafic: TraficEnum.ProtoBuffer, - sharedArrayBuffers: {}, - drawType: -2, - endNS: 10360520695.855345, - intervalPerf: 1, - maxCpuCount: -1, - pid: 11, - recordEndNS: 30418971157414, - recordStartNS: 30369799963682, - scale: 20000000, - startNS: 9901354882.564587, - width: 888, - }, - }; - proc1 = jest.fn((sql) => [ - { hiperfData: { callchainId: 262, eventCount: 14, eventTypeId: 1, sampleCount: 1, startNs: 130000000 } }, - { hiperfData: { callchainId: 422, eventCount: 24, eventTypeId: 2, sampleCount: 1, startNs: 170000000 } }, - ]); - proc2 = jest.fn((sql) => [ - { hiperfData: { callchainId: 12515, eventCount: 191077, eventTypeId: 1, sampleCount: 1, startNs: 10017921673 } }, - { hiperfData: { callchainId: 94, eventCount: 140815, eventTypeId: 1, sampleCount: 1, startNs: 10022069465 } }, - ]); - }); - it('HiperfProcessReceiverTest01', () => { - expect(chartHiperfProcessData10MSProtoSql(data1.params)).toBeTruthy(); - expect(chartHiperfProcessDataProtoSql(data2.params)).toBeTruthy(); - }); - it('HiperfProcessReceiverTest02', () => { - let mockPostMessage = jest.fn(); - global.postMessage = mockPostMessage; - hiperfProcessDataReceiver(data1, proc1); - expect(mockPostMessage).toHaveBeenCalledTimes(1); - }); - it('HiperfProcessReceiverTest03', () => { - let mockPostMessage = jest.fn(); - global.postMessage = mockPostMessage; - hiperfProcessDataReceiver(data2, proc2); - expect(mockPostMessage).toHaveBeenCalledTimes(1); - }); -}); diff --git a/ide/test/trace/database/data-trafic/HiperfProcessDataSender.test.ts b/ide/test/trace/database/data-trafic/HiperfProcessDataSender.test.ts deleted file mode 100644 index 987e0ef3..00000000 --- a/ide/test/trace/database/data-trafic/HiperfProcessDataSender.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2022 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 { TraceRow } from '../../../../src/trace/component/trace/base/TraceRow'; -import { hiperfProcessDataSender } from '../../../../src/trace/database/data-trafic/HiperfProcessDataSender'; -import { threadPool } from '../../../../src/trace/database/SqlLite'; -import { HiPerfProcessStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerHiPerfProcess'; -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); -describe('HiperfProcessSender Test', () => { - let traceRowData = [ - { - dur: 10000000, - frame: { x: 2, y: 0, width: 1, height: 4 }, - startNS: 170000000, - callchain_id: 422, - event_count: 24, - event_type_id: 2, - height: 4, - sampleCount: 1, - }, - { - dur: 10000000, - frame: { x: 2, y: 0, width: 2, height: 8 }, - startNS: 180000000, - callchain_id: 262, - event_count: 40, - event_type_id: 1, - height: 8, - sampleCount: 2, - }, - ]; - it('HiperfProcessSenderTest01', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(traceRowData, traceRowData.length, true); - }); - let traceRow = TraceRow.skeleton(); - hiperfProcessDataSender(11, -2, 1, 2000000000, traceRow).then((res) => { - expect(res).toHaveLength(2); - }); - }); -}); diff --git a/ide/test/trace/database/data-trafic/HiperfThreadDataReceiver.test.ts b/ide/test/trace/database/data-trafic/HiperfThreadDataReceiver.test.ts deleted file mode 100644 index 87f87797..00000000 --- a/ide/test/trace/database/data-trafic/HiperfThreadDataReceiver.test.ts +++ /dev/null @@ -1,87 +0,0 @@ -/* - * Copyright (C) 2022 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 { TraficEnum } from '../../../../src/trace/database/data-trafic/QueryEnum'; -import { - chartHiperfThreadData10MSProtoSql, - chartHiperfThreadDataProtoSql, - hiperfThreadDataReceiver, -} from '../../../../src/trace/database/data-trafic/HiperfThreadDataReceiver'; - -describe('HiperfThread Test', () => { - let data1; - let data2; - let proc1; - let proc2; - - beforeEach(() => { - data1 = { - params: { - trafic: TraficEnum.ProtoBuffer, - sharedArrayBuffers: {}, - drawType: -2, - endNS: 49171193732, - intervalPerf: 1, - maxCpuCount: -1, - recordEndNS: 30418971157414, - recordStartNS: 30369799963682, - scale: 2000000000, - startNS: 0, - tid: 28917, - width: 841, - }, - }; - data2 = { - params: { - trafic: TraficEnum.ProtoBuffer, - sharedArrayBuffers: {}, - drawType: -2, - endNS: 38843292896.21842, - intervalPerf: 1, - maxCpuCount: -1, - recordEndNS: 30418971157414, - recordStartNS: 30369799963682, - scale: 20000000, - startNS: 38410507602.73825, - tid: 28917, - width: 841, - }, - }; - proc1 = jest.fn((sql) => [ - { hiperfData: { callchainId: 12, eventCount: 3603585, sampleCount: 11, startNs: 0 } }, - { hiperfData: { callchainId: 128, eventCount: 728632, sampleCount: 1, startNs: 70000000 } }, - ]); - proc2 = jest.fn((sql) => [ - { hiperfData: { callchainId: 1114, eventCount: 106450, sampleCount: 1, startNs: 38427936069 } }, - { hiperfData: { callchainId: 94, eventCount: 140815, sampleCount: 1, startNs: 38428328069 } }, - ]); - }); - it('HiperfThreadReceiverTest01', () => { - expect(chartHiperfThreadData10MSProtoSql(data1.params)).toBeTruthy(); - expect(chartHiperfThreadDataProtoSql(data2.params)).toBeTruthy(); - }); - it('HiperfThreadReceiverTest02', () => { - let mockPostMessage = jest.fn(); - global.postMessage = mockPostMessage; - hiperfThreadDataReceiver(data1, proc1); - expect(mockPostMessage).toHaveBeenCalledTimes(1); - }); - it('HiperfThreadReceiverTest03', () => { - let mockPostMessage = jest.fn(); - global.postMessage = mockPostMessage; - hiperfThreadDataReceiver(data2, proc2); - expect(mockPostMessage).toHaveBeenCalledTimes(1); - }); -}); diff --git a/ide/test/trace/database/data-trafic/HiperfThreadDataSender.test.ts b/ide/test/trace/database/data-trafic/HiperfThreadDataSender.test.ts deleted file mode 100644 index 4c6d6ee1..00000000 --- a/ide/test/trace/database/data-trafic/HiperfThreadDataSender.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2022 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 { TraceRow } from '../../../../src/trace/component/trace/base/TraceRow'; -import { hiperfThreadDataSender } from '../../../../src/trace/database/data-trafic/HiperfThreadDataSender'; -import { threadPool } from '../../../../src/trace/database/SqlLite'; -import { HiPerfThreadStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerHiPerfThread'; -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); -describe('HiperfThreadSender Test', () => { - let traceRowData = [ - { - dur: 10000000, - frame: { x: 0, y: 0, width: 1, height: 44 }, - startNS: 0, - callchain_id: 12, - event_count: 3603585, - event_type_id: 0, - height: 44, - sampleCount: 11, - }, - { - dur: 10000000, - frame: { x: 1, y: 0, width: 1, height: 4 }, - startNS: 70000000, - callchain_id: 128, - event_count: 728632, - event_type_id: 0, - height: 4, - sampleCount: 1, - }, - ]; - it('HiperfThreadSenderTest01', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(traceRowData, traceRowData.length, true); - }); - let traceRow = TraceRow.skeleton(); - hiperfThreadDataSender(28917, -2, 1, 2000000000, traceRow).then((res) => { - expect(res).toHaveLength(2); - }); - }); -}); diff --git a/ide/test/trace/database/data-trafic/IrqDataReceiver.test.ts b/ide/test/trace/database/data-trafic/IrqDataReceiver.test.ts deleted file mode 100644 index 1595a9d8..00000000 --- a/ide/test/trace/database/data-trafic/IrqDataReceiver.test.ts +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright (C) 2022 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 { TraficEnum } from '../../../../src/trace/database/data-trafic/QueryEnum'; -import { - chartIrqDataSql, - chartIrqDataSqlMem, - irqDataReceiver, -} from '../../../../src/trace/database/data-trafic/IrqDataReceiver'; - -describe('IrqReceiver Test', () => { - let data1; - let data2; - let proc; - - beforeEach(() => { - data1 = { - params: { - trafic: TraficEnum.ProtoBuffer, - cpu: 0, - endNS: 19473539059, - name: 'irq', - recordEndNS: 30167849973030, - recordStartNS: 30148376433971, - startNS: 0, - t: 1703665514720, - width: 708, - sharedArrayBuffers: {}, - }, - }; - data2 = { - params: { - trafic: TraficEnum.Memory, - cpu: 0, - endNS: 19473539059, - name: 'irq', - recordEndNS: 30167849973030, - recordStartNS: 30148376433971, - startNS: 0, - t: 1703665514720, - width: 708, - sharedArrayBuffers: {}, - }, - }; - proc = jest.fn((sql) => [ - { irqData: { argSetId: 74, dur: 3646, id: 74, startNs: 4255208 } }, - { irqData: { argSetId: 400, dur: 3125, id: 397, startNs: 38229687 } }, - ]); - }); - test('IrqReceiverTest01', () => { - const args = { - trafic: TraficEnum.ProtoBuffer, - cpu: 0, - endNS: 19473539059, - name: 'irq', - recordEndNS: 30167849973030, - recordStartNS: 30148376433971, - startNS: 0, - t: 1703665514720, - width: 708, - sharedArrayBuffers: {}, - }; - expect(chartIrqDataSql(args)).toBeTruthy(); - }); - test('IrqReceiverTest02', () => { - const args = { - trafic: TraficEnum.Memory, - cpu: 0, - endNS: 19473539059, - name: 'irq', - recordEndNS: 30167849973030, - recordStartNS: 30148376433971, - startNS: 0, - t: 1703665514720, - width: 708, - sharedArrayBuffers: {}, - }; - expect(chartIrqDataSqlMem(args)).toBeTruthy(); - }); - test('IrqReceiverTest03', () => { - let mockPostMessage = jest.fn(); - global.postMessage = mockPostMessage; - irqDataReceiver(data1, proc); - expect(mockPostMessage).toHaveBeenCalledTimes(1); - }); - test('IrqReceiverTest04', () => { - let mockPostMessage = jest.fn(); - global.postMessage = mockPostMessage; - irqDataReceiver(data2, proc); - expect(mockPostMessage).toHaveBeenCalledTimes(1); - }); -}); diff --git a/ide/test/trace/database/data-trafic/IrqDataSender.test.ts b/ide/test/trace/database/data-trafic/IrqDataSender.test.ts deleted file mode 100644 index 17601767..00000000 --- a/ide/test/trace/database/data-trafic/IrqDataSender.test.ts +++ /dev/null @@ -1,52 +0,0 @@ -/* - * Copyright (C) 2022 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 { TraceRow } from '../../../../src/trace/component/trace/base/TraceRow'; -import { irqDataSender } from '../../../../src/trace/database/data-trafic/IrqDataSender'; -import { threadPool } from '../../../../src/trace/database/SqlLite'; -import { IrqStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerIrq'; -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); -describe('irqDataSender Test', () => { - let IrqData = [ - { - argSetId: 74, - depth: 0, - dur: 3646, - frame: { x: 0, y: 5, width: 1, height: 30 }, - id: 74, - name: 'IPI', - startNS: 4255208, - }, - { - argSetId: 400, - depth: 0, - dur: 3125, - frame: { x: 1, y: 5, width: 1, height: 30 }, - id: 397, - name: 'IPI', - startNS: 38229687, - }, - ]; - it('IrqDataSenderTest01', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(IrqData, IrqData.length, true); - }); - let traceRow = TraceRow.skeleton(); - irqDataSender(0, 'irq', traceRow).then((res) => { - expect(res).toHaveLength(2); - }); - }); -}); diff --git a/ide/test/trace/database/data-trafic/LogDataReceiver.test.ts b/ide/test/trace/database/data-trafic/LogDataReceiver.test.ts deleted file mode 100644 index 3d637af4..00000000 --- a/ide/test/trace/database/data-trafic/LogDataReceiver.test.ts +++ /dev/null @@ -1,55 +0,0 @@ -/* - * Copyright (C) 2022 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 { - logDataReceiver, - chartLogDataSql -} from '../../../../src/trace/database/data-trafic/LogDataReceiver'; -import { TraficEnum } from '../../../../src/trace/database/data-trafic/QueryEnum'; - -describe('logDataReceiver Test', () => { - let data; - let proc; - - beforeEach(() => { - data = { - params: { - trafic: TraficEnum.ProtoBuffer, - sharedArrayBuffers: { - id: new Uint16Array([1, 2, 3]), - }, - }, - }; - proc = jest.fn((sql) => [ - {logData: {id: 4, startTs: 4.4, pid: 40, tid: 400, dur: 40000, depth: 4}}, - {logData: {id: 5, startTs: 5.5, pid: 50, tid: 500, dur: 50000, depth: 5}}, - ]); - }); - it('logDataReceiverTest01', () => { - const args = { - recordStartNS: 1000, - endNS: 3000, - startNS: 2000, - width: 10 - }; - expect(chartLogDataSql(args)).toBeTruthy(); - }); - it('logDataReceiverTest02', () => { - const mockPostMessage = jest.fn(); - global.postMessage = mockPostMessage; - logDataReceiver(data, proc); - expect(mockPostMessage).toHaveBeenCalledTimes(1); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/LogDataSender.test.ts b/ide/test/trace/database/data-trafic/LogDataSender.test.ts deleted file mode 100644 index 98f379eb..00000000 --- a/ide/test/trace/database/data-trafic/LogDataSender.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2022 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 { LogDataSender } from '../../../../src/trace/database/data-trafic/LogDataSender'; -import { threadPool } from '../../../../src/trace/database/SqlLite'; -import { LogStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerLog'; -import { TraceRow } from '../../../../src/trace/component/trace/base/TraceRow'; -import { QueryEnum } from '../../../../src/trace/database/data-trafic/QueryEnum'; - -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); -describe('LogDataSender Test', () => { - let logData = [{ - id: 4, - startTs: 162769475, - pid: 2082, - tid: 2082, - dur: 1, - depth: 1, - tag: 'C02c01/Init', - context: '[param_request.c:53]Can not get log level from param, keep the original loglevel.', - originTime: '08-06 15:43:19.954', - processName: 'hilog', - level: 'Info', - frame: { - 'x': 1, - 'y': 7, - 'width': 1, - 'height': 7 - } - }]; - it('LogDataSenderTest01', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(logData, logData.length, true); - }); - let logTraceRow = TraceRow.skeleton(); - LogDataSender(QueryEnum.HilogData, logTraceRow).then(res => { - expect(res).toHaveLength(1); - }); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/NativeMemoryDataReceiver.test.ts b/ide/test/trace/database/data-trafic/NativeMemoryDataReceiver.test.ts deleted file mode 100644 index 6f94640c..00000000 --- a/ide/test/trace/database/data-trafic/NativeMemoryDataReceiver.test.ts +++ /dev/null @@ -1,74 +0,0 @@ -/* - * Copyright (C) 2022 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 { - filterNativeMemoryChartData, - nativeMemoryDataHandler -} from '../../../../src/trace/database/data-trafic/NativeMemoryDataReceiver.js'; - -describe(' NativeMemoryDataReceiver Test', () => { - let data; - let proc; - const dataCache = { - normalCache: new Map(), - statisticsCache: new Map(), - }; - beforeEach(() => { - data = { - id: 'c07094fb-5340-4f1e-be9d-cd4071a77e24', - name: 206, - action: 'exec-proto', - params: { - totalNS: 108952700947, - recordStartNS: 8406282873525, - recordEndNS: 8515235574472, - model: 'native_hook', - processes: [ - 1 - ], - trafic: 1, - isCache: true - } - }; - proc = jest.fn((sql) => [ - {data: {id: 4, startTs: 4.4, pid: 40, tid: 400, dur: 40000, depth: 4}}, - {data: {id: 5, startTs: 5.5, pid: 50, tid: 500, dur: 50000, depth: 5}}, - ]); - }); - afterEach(() => { - dataCache.normalCache.clear(); - dataCache.statisticsCache.clear(); - }); - it(' NativeMemoryDataReceiver01', () => { - const mockPostMessage = jest.fn(); - global.postMessage = mockPostMessage; - nativeMemoryDataHandler(data, proc); - expect(mockPostMessage).toHaveBeenCalledTimes(1); - }); - it(' NativeMemoryDataReceiver02', () => { - const model = 'native_hook'; - const startNS = 0; - const endNS = 100; - const totalNS = 200; - const drawType = 0; - const frame = 1; - const key = 'testKey'; - const result = filterNativeMemoryChartData(model, startNS, endNS, totalNS, drawType, frame, key); - expect(result.startTime).toEqual([]); - expect(result.dur).toEqual([]); - expect(result.heapSize).toEqual([]); - expect(result.density).toEqual([]); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/NativeMemoryDataSender.test.ts b/ide/test/trace/database/data-trafic/NativeMemoryDataSender.test.ts deleted file mode 100644 index 33cd3d27..00000000 --- a/ide/test/trace/database/data-trafic/NativeMemoryDataSender.test.ts +++ /dev/null @@ -1,68 +0,0 @@ -/* - * Copyright (C) 2022 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 { threadPool } from '../../../../src/trace/database/SqlLite'; -import { TraceRow } from '../../../../src/trace/component/trace/base/TraceRow'; -import { - nativeMemoryChartDataCacheSender, - nativeMemoryChartDataSender -} from '../../../../src/trace/database/data-trafic/NativeMemoryDataSender'; -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); - -describe('NativeMemoryDataSender Test',()=>{ - let NativeMemoryData = [{ - startTime: 3384276048, - dur: 369027787, - heapsize: 17380280, - density: 193, - maxHeapSize: 58546932, - maxDensity: 4993, - minHeapSize: 0, - minDensity: 0, - frame: { - x: 17, - y: 5, - width: 2, - height: 30 - } - }] - it('NativeMemoryDataSenderTest01 ', function () { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(NativeMemoryData, NativeMemoryData.length, true); - }); - let nativeMemoryChartDataTraceRow = TraceRow.skeleton(); - let setting = { - eventType: 0, - ipid: 1, - model: "native_hook", - drawType: 0 - } - nativeMemoryChartDataSender(nativeMemoryChartDataTraceRow,setting).then(res => { - expect(res).toHaveLength(1); - }); - }); - it('NativeMemoryDataSenderTest02 ', function () { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(NativeMemoryData, NativeMemoryData.length, true); - }); - let processes = [1]; - let model = 'native_hook'; - nativeMemoryChartDataCacheSender(processes,model).then(res => { - expect(res).toHaveLength(2); - }); - }); -}) \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/ProcessActualDataReceiver.test.ts b/ide/test/trace/database/data-trafic/ProcessActualDataReceiver.test.ts deleted file mode 100644 index 10e1deb4..00000000 --- a/ide/test/trace/database/data-trafic/ProcessActualDataReceiver.test.ts +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright (C) 2022 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 { processActualDataReceiver } from '../../../../src/trace/database/data-trafic/ProcessActualDataReceiver'; - -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); - -describe('ProcessActualDataReceiver Test', () => { - let data = { - action: "exec-proto", - id: "5", - name: 27, - params: - { - endNS: 8711323000, - pid: 994, - recordEndNS: 512261248000, - recordStartNS: 503549925000, - sharedArrayBuffers: undefined, - startNS: 0, - t: 1703558234327, - trafic: 3, - width: 1407 - } - } - let actualData = [{ - processJanksActualData: { - dstSlice: -1, - dur: 6769000, - id: 1296, - name: 1336, - pid: 994, - ts: 5945218000 - } - }] - - it('ActualDataReceiverTest01', async () => { - (self as unknown as Worker).postMessage = jest.fn(() => true); - expect(processActualDataReceiver(data, () => { - return actualData; - })).toBeUndefined(); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/ProcessActualDataSender.test.ts b/ide/test/trace/database/data-trafic/ProcessActualDataSender.test.ts deleted file mode 100644 index d651e753..00000000 --- a/ide/test/trace/database/data-trafic/ProcessActualDataSender.test.ts +++ /dev/null @@ -1,66 +0,0 @@ -/* - * Copyright (C) 2022 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 { threadPool } from '../../../../src/trace/database/SqlLite'; -import { TraceRow } from '../../../../src/trace/component/trace/base/TraceRow'; -import { processActualDataSender } from '../../../../src/trace/database/data-trafic/ProcessActualDataSender'; -import { JankStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerJank'; - -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); - -describe('ProcessActualDataSender Test', () => { - let actualData = [ - { - cmdline: "com.ohos.launch", - depth: 0, - dst_slice: 506, - dur: 2273000, - frame: {x: 393, y: 0, width: 1, height: 20}, - frame_type: "app", - id: 502, - jank_tag: 0, - name: 2171, - pid: 2128, - src_slice: "", - ts: 2435796000, - type: 0 - }, - { - cmdline: "com.ohos.launch", - depth: 0, - dst_slice: 510, - dur: 2395000, - frame: {x: 395, y: 0, width: 1, height: 20}, - frame_type: "app", - id: 508, - jank_tag: 0, - name: 2172, - pid: 2128, - src_slice: "", - ts: 2452847000, - type: 0 - }] - it('ActualDataSenderTest01', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(actualData, actualData.length, true); - }); - let actualTraceRow = TraceRow.skeleton(); - processActualDataSender(2128, actualTraceRow).then(result => { - expect(result).toHaveLength(2); - }); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/ProcessDataReceiver.test.ts b/ide/test/trace/database/data-trafic/ProcessDataReceiver.test.ts deleted file mode 100644 index 226698b1..00000000 --- a/ide/test/trace/database/data-trafic/ProcessDataReceiver.test.ts +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Copyright (C) 2022 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 { processDataReceiver } from '../../../../src/trace/database/data-trafic/ProcessDataReceiver'; - -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); - -describe('ProcessDataReceiver Test', () => { - let data = { - action: "exec-proto", - id: "6", - name: 6, - params: - { - endNS: 8711323000, - pid: 431, - recordEndNS: 512261248000, - recordStartNS: 503549925000, - sharedArrayBuffers: undefined, - startNS: 0, - t: 1703560455293, - trafic: 0, - width: 1407 - } - } - let processData = [ - { - cpu: 1, - dur: 1136000, - startTime: 3650382000, - v: true, - }, - { - cpu: 1, - dur: 104000, - startTime: 3665355000 - } - ] - it('ProcessDataReceiverTest01', async () => { - (self as unknown as Worker).postMessage = jest.fn(() => true); - expect(processDataReceiver(data, () => { - return processData; - })).toBeUndefined(); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/ProcessDataSender.test.ts b/ide/test/trace/database/data-trafic/ProcessDataSender.test.ts deleted file mode 100644 index 6744fe74..00000000 --- a/ide/test/trace/database/data-trafic/ProcessDataSender.test.ts +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) 2022 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 { threadPool } from '../../../../src/trace/database/SqlLite'; -import { TraceRow } from '../../../../src/trace/component/trace/base/TraceRow'; -import { processDataSender } from "../../../../src/trace/database/data-trafic/ProcessDataSender"; -import { ProcessStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerProcess'; - -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); - -describe('ProcessDataSender Test', () => { - let processData = [ - { - cpu: 0, - dur: 140000, - startTime: 8339440000, - }, - { - cpu: 0, - dur: 138000, - startTime: 8355773000 - }] - it('ProcessDataSenderTest01', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(processData, processData.length, true); - }); - let processTraceRow = TraceRow.skeleton(); - processDataSender(994, processTraceRow).then(result => { - expect(result).toHaveLength(2); - }); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/ProcessDeliverInputEventDataReceiver.test.ts b/ide/test/trace/database/data-trafic/ProcessDeliverInputEventDataReceiver.test.ts deleted file mode 100644 index 0edc355b..00000000 --- a/ide/test/trace/database/data-trafic/ProcessDeliverInputEventDataReceiver.test.ts +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Copyright (C) 2022 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 { - processDeliverInputEventDataReceiver -} from '../../../../src/trace/database/data-trafic/ProcessDeliverInputEventDataReceiver'; - -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); - -describe('DeliverInputEventDataReceiver Test', () => { - let data = { - action: "exec-proto", - id: "52", - name: 28, - params: - { - endNS: 20000305000, - recordEndNS: 168778663166000, - recordStartNS: 168758662861000, - sharedArrayBuffers: undefined, - startNS: 0, - t: 1703561897634, - tid: "1298", - trafic: 3, - width: 1407 - } - } - let res = [ - { - processInputEventData: { - argsetid: -1, - cookie: 10350, - dur: 83000, - id: 41459, - isMainThread: 1, - parentId: -1, - pid: 1298, - startTs: 7379559000, - tid: 1298, - trackId: 14 - } - }] - it('DeliverInputEventDataReceiverTest01', async () => { - let mockCallback = jest.fn(() => res); - (self as unknown as Worker).postMessage = jest.fn(); - processDeliverInputEventDataReceiver(data, mockCallback); - expect(mockCallback).toHaveBeenCalled(); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/ProcessDeliverInputEventDataSender.test.ts b/ide/test/trace/database/data-trafic/ProcessDeliverInputEventDataSender.test.ts deleted file mode 100644 index 1e212df0..00000000 --- a/ide/test/trace/database/data-trafic/ProcessDeliverInputEventDataSender.test.ts +++ /dev/null @@ -1,53 +0,0 @@ -/* - * Copyright (C) 2022 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 { threadPool } from '../../../../src/trace/database/SqlLite'; -import { TraceRow } from '../../../../src/trace/component/trace/base/TraceRow'; -import { FuncStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerFunc'; -import { - processDeliverInputEventDataSender -} from '../../../../src/trace/database/data-trafic/ProcessDeliverInputEventDataSender'; - -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); - -describe('ProcessDataSender Test', () => { - let inputEventData = [{ - argsetid: -1, - cookie: 684, - depth: 0, - dur: 781000, - frame: {x: 516, y: 0, width: 1, height: 20}, - funName: "deliverInputEvent", - id: 40814, - is_main_thread: 1, - parent_id: 7256, - pid: 7256, - startTs: 7340590000, - threadName: "ndroid.settings", - tid: 7256, - track_id: 136 - }] - it('ProcessDataSenderTest01', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(inputEventData, inputEventData.length, true); - }); - let inputEventTraceRow = TraceRow.skeleton(); - processDeliverInputEventDataSender(7256, inputEventTraceRow).then(result => { - expect(result).toHaveLength(1); - }); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/ProcessExpectedDataReceiver.test.ts b/ide/test/trace/database/data-trafic/ProcessExpectedDataReceiver.test.ts deleted file mode 100644 index 7d243fe9..00000000 --- a/ide/test/trace/database/data-trafic/ProcessExpectedDataReceiver.test.ts +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2022 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 { processExpectedDataReceiver } from '../../../../src/trace/database/data-trafic/ProcessExpectedDataReceiver'; - -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); - -describe('ProcessExpectedDataReceiver Test', () => { - let data = { - action: "exec-proto", - id: "966", - name: 26, - params: - { - endNS: 8711323000, - pid: 994, - recordEndNS: 512261248000, - recordStartNS: 503549925000, - sharedArrayBuffers: undefined, - startNS: 0, - t: 1703572989578, - trafic: 3, - width: 1407 - } - } - let expectedData = [{ - processJanksFramesData: { - dur: 16627734, - id: 415, - name: 1143, - pid: 994, - ts: 2086211199, - type: 1 - } - }] - it('ExpectedDataReceiverTest01', async () => { - (self as unknown as Worker).postMessage = jest.fn(() => true); - expect(processExpectedDataReceiver(data, () => { - return expectedData; - })).toBeUndefined(); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/ProcessExpectedDataSender.test.ts b/ide/test/trace/database/data-trafic/ProcessExpectedDataSender.test.ts deleted file mode 100644 index fe9fde8c..00000000 --- a/ide/test/trace/database/data-trafic/ProcessExpectedDataSender.test.ts +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2022 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 { processExpectedDataSender } from '../../../../src/trace/database/data-trafic/ProcessExpectedDataSender'; -import { TraceRow } from '../../../../src/trace/component/trace/base/TraceRow'; -import { JankStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerJank'; -import { threadPool } from '../../../../src/trace/database/SqlLite'; - -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); - -describe('ProcessExpectedDataSender Test', () => { - let expectedData = [{ - cmdline: "render_service", - depth: 0, - dur: 16627734, - frame: {x: 336, y: 0, width: 3, height: 20}, - frame_type: "render_service", - id: 415, - name: 1143, - pid: 994, - ts: 2086211199, - type: 1143 - }] - it('ExpectedDataSenderTest01', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(expectedData, expectedData.length, true); - }); - let expectedTraceRow = TraceRow.skeleton(); - processExpectedDataSender(994, expectedTraceRow).then(result => { - expect(result).toHaveLength(1); - }); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/ProcessMemDataReceiver.test.ts b/ide/test/trace/database/data-trafic/ProcessMemDataReceiver.test.ts deleted file mode 100644 index d0bf165c..00000000 --- a/ide/test/trace/database/data-trafic/ProcessMemDataReceiver.test.ts +++ /dev/null @@ -1,54 +0,0 @@ -/* - * Copyright (C) 2022 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 { processMemDataReceiver } from '../../../../src/trace/database/data-trafic/ProcessMemDataReceiver'; - -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); - -describe('ProcessMemDataReceiver Test', () => { - let data = { - action: "exec-proto", - id: "71", - name: 7, - params: - { - endNS: 20000305000, - recordEndNS: 168778663166000, - recordStartNS: 168758662861000, - sharedArrayBuffers: undefined, - startNS: 0, - t: 1703574363518, - trackId: 543, - trafic: 3, - width: 1407 - } - } - let memData = [{ - processMemData: { - startTime: 7578590000, - trackId: 545, - ts: 168766241451000, - value: 1728 - } - }] - it('ProcessMemDataReceiverTest01', async () => { - (self as unknown as Worker).postMessage = jest.fn(() => true); - expect(processMemDataReceiver(data, () => { - return memData; - })).toBeUndefined(); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/ProcessMemDataSender.test.ts b/ide/test/trace/database/data-trafic/ProcessMemDataSender.test.ts deleted file mode 100644 index fcd702df..00000000 --- a/ide/test/trace/database/data-trafic/ProcessMemDataSender.test.ts +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2022 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 { TraceRow } from '../../../../src/trace/component/trace/base/TraceRow'; -import { threadPool } from '../../../../src/trace/database/SqlLite'; -import { processMemDataSender } from '../../../../src/trace/database/data-trafic/ProcessMemDataSender'; -import { ProcessMemStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerMem'; - -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); - -describe('ProcessMemDataSender Test', () => { - let memData = [{ - delta: 0, - duration: 4077000, - frame: {x: 645, y: 5, width: 1, height: 30}, - maxValue: 5, - startTime: 9178680000, - track_id: 31, - ts: 168767841541000, - value: 3 - }] - it('ProcessMemDataSenderTest01', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(memData, memData.length, true); - }); - let memTraceRow = TraceRow.skeleton(); - processMemDataSender(543, memTraceRow).then(result => { - expect(result).toHaveLength(1); - }); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/ProcessSoInitDataReceiver.test.ts b/ide/test/trace/database/data-trafic/ProcessSoInitDataReceiver.test.ts deleted file mode 100644 index 0dc35354..00000000 --- a/ide/test/trace/database/data-trafic/ProcessSoInitDataReceiver.test.ts +++ /dev/null @@ -1,46 +0,0 @@ -/* - * Copyright (C) 2022 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 { processSoInitDataReceiver } from '../../../../src/trace/database/data-trafic/ProcessSoInitDataReceiver'; - -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); - -describe('ProcessSoInitDataReceiver Test', () => { - let data = { - action: "exec-proto", - id: "81", - name: 8, - params: - { - endNS: 29372913537, - pid: 4794, - recordEndNS: 262379203084, - recordStartNS: 233006289547, - sharedArrayBuffers: undefined, - startNS: 0, - t: 1703581047560, - trafic: 3, - width: 1407 - } - } - it('SoInitDataReceiverTest01', async () => { - (self as unknown as Worker).postMessage = jest.fn(() => true); - expect(processSoInitDataReceiver(data, () => { - return []; - })).toBeUndefined(); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/ProcessSoInitDataSender.test.ts b/ide/test/trace/database/data-trafic/ProcessSoInitDataSender.test.ts deleted file mode 100644 index 988c5282..00000000 --- a/ide/test/trace/database/data-trafic/ProcessSoInitDataSender.test.ts +++ /dev/null @@ -1,35 +0,0 @@ -/* - * Copyright (C) 2022 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 { TraceRow } from '../../../../src/trace/component/trace/base/TraceRow'; -import { threadPool } from '../../../../src/trace/database/SqlLite'; -import { processSoInitDataSender } from '../../../../src/trace/database/data-trafic/ProcessSoInitDataSender'; -import { SoStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerSoInit'; - -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); - -describe('ProcessSoInitDataSender Test', () => { - it('ProcessSoInitDataSenderTest01', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback([], 0, true); - }); - let soInitTraceRow = TraceRow.skeleton(); - processSoInitDataSender(543, soInitTraceRow).then(result => { - expect(result).toHaveLength(0); - }); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/ProcessStartupDataReceiver.test.ts b/ide/test/trace/database/data-trafic/ProcessStartupDataReceiver.test.ts deleted file mode 100644 index 6867993d..00000000 --- a/ide/test/trace/database/data-trafic/ProcessStartupDataReceiver.test.ts +++ /dev/null @@ -1,56 +0,0 @@ -/* - * Copyright (C) 2022 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 { processStartupDataReceiver } from '../../../../src/trace/database/data-trafic/ProcessStartupDataReceiver'; - -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); - -describe('ProcessStartupDataReceiver Test', () => { - let data = { - action: "exec-proto", - id: "81", - name: 8, - params: - { - endNS: 29372913537, - pid: 4794, - recordEndNS: 262379203084, - recordStartNS: 233006289547, - sharedArrayBuffers: undefined, - startNS: 0, - t: 1703581047560, - trafic: 3, - width: 1407 - } - } - let startUpData = [{ - processStartupData: { - dur: 6055208, - itid: 76, - pid: 4794, - startName: 1, - startTime: 266994271, - tid: 4794 - } - }] - it('StartupDataReceiverTest01', async () => { - (self as unknown as Worker).postMessage = jest.fn(() => true); - expect(processStartupDataReceiver(data, () => { - return startUpData; - })).toBeUndefined(); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/ProcessStartupDataSender.test.ts b/ide/test/trace/database/data-trafic/ProcessStartupDataSender.test.ts deleted file mode 100644 index 0c6c9766..00000000 --- a/ide/test/trace/database/data-trafic/ProcessStartupDataSender.test.ts +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2022 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 { TraceRow } from '../../../../src/trace/component/trace/base/TraceRow'; -import { threadPool } from '../../../../src/trace/database/SqlLite'; -import { AppStartupStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerAppStartup'; -import { processStartupDataSender } from '../../../../src/trace/database/data-trafic/ProcessStartupDataSender'; - -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); - -describe('ProcessStartupDataSender Test', () => { - let startupData = [{ - dur: 6055208, - endItid: 167, - frame: {y: 5, height: 20, x: 12, width: 2}, - itid: 76, - pid: 4794, - startName: 1, - startTs: 266994271, - tid: 4794 - }] - it('ProcessStartupDataSenderTest01', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(startupData, startupData.length, true); - }); - let startupTraceRow = TraceRow.skeleton(); - processStartupDataSender(4794, startupTraceRow).then(result => { - expect(result).toHaveLength(1); - }); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/ThreadDataSender.test.ts b/ide/test/trace/database/data-trafic/ThreadDataSender.test.ts deleted file mode 100644 index 533a4ba7..00000000 --- a/ide/test/trace/database/data-trafic/ThreadDataSender.test.ts +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2022 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 { TraceRow } from '../../../../src/trace/component/trace/base/TraceRow'; -import { threadPool } from '../../../../src/trace/database/SqlLite'; -import { threadDataSender } from '../../../../src/trace/database/data-trafic/ThreadDataSender'; -import { ThreadStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerThread'; - -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); - -describe('ThreadDataSender Test', () => { - let threadData = [{ - argSetID: -1, - cpu: 2, - dur: 496000, - frame: {y: 5, height: 20, x: 369, width: 1}, - id: 23, - pid: 1668, - startTime: 2629548000, - state: "Running", - tid: 1693, - translateY: 650 - }] - it('ThreadDataSenderTest01', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(threadData, threadData.length, true); - }); - let threadTraceRow = TraceRow.skeleton(); - threadDataSender(543, 12, threadTraceRow).then(result => { - expect(result).toHaveLength(1); - }); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/VirtualMemoryDataReceiver.test.ts b/ide/test/trace/database/data-trafic/VirtualMemoryDataReceiver.test.ts deleted file mode 100644 index d23f5c18..00000000 --- a/ide/test/trace/database/data-trafic/VirtualMemoryDataReceiver.test.ts +++ /dev/null @@ -1,58 +0,0 @@ -/* - * Copyright (C) 2022 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 { virtualMemoryDataReceiver } from '../../../../src/trace/database/data-trafic/VirtualMemoryDataReceiver'; - -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); - -describe('VirtualMemoryDataReceiver Test', () => { - let data = { - action: "exec-proto", - id: "30", - name: 12, - params: - { - endNS: 109726762483, - filterId: 6347, - recordEndNS: 490640100187894, - recordStartNS: 490530373425411, - sharedArrayBuffers: undefined, - startNS: 0, - t: 1703643817436, - trafic: 3, - width: 1407 - } - } - - let vmData = [{ - virtualMemData: { - delta: -1, - duration: 252, - filterId: 6347, - maxValue: -1, - startTime: 19680640101, - value: 423440 - } - }] - it('VirtualMemoryReceiverTest01', async () => { - const mockCallback = jest.fn(() => vmData); - const mockPostMessage = jest.fn(); - (self as unknown as Worker).postMessage = mockPostMessage; - virtualMemoryDataReceiver(data, mockCallback); - expect(mockCallback).toHaveBeenCalled(); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/VirtualMemoryDataSender.test.ts b/ide/test/trace/database/data-trafic/VirtualMemoryDataSender.test.ts deleted file mode 100644 index 3545f25f..00000000 --- a/ide/test/trace/database/data-trafic/VirtualMemoryDataSender.test.ts +++ /dev/null @@ -1,45 +0,0 @@ -/* - * Copyright (C) 2022 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 { TraceRow } from '../../../../src/trace/component/trace/base/TraceRow'; -import { threadPool } from '../../../../src/trace/database/SqlLite'; -import { virtualMemoryDataSender } from '../../../../src/trace/database/data-trafic/VirtualMemoryDataSender'; -import { VirtualMemoryStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerVirtualMemory'; - -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); - -describe('VirtualMemoryDataSender Test', () => { - let resultVm = [{ - delta: -9, - duration: 4830101562, - filterID: 202, - frame: {x: 190, y: 5, width: 62, height: 30}, - maxValue: 144753, - startTime: 14850538539, - value: 124362 - }] - it('VirtualMemorySenderTest01', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(resultVm, resultVm.length, true); - }); - let virtualMemoryTraceRow = TraceRow.skeleton(); - virtualMemoryDataSender(6346, virtualMemoryTraceRow).then(result => { - expect(result).toHaveLength(1); - expect(threadPool.submitProto).toHaveBeenCalled(); - }); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/VmTrackerDataReceiver.test.ts b/ide/test/trace/database/data-trafic/VmTrackerDataReceiver.test.ts deleted file mode 100644 index 69e533c0..00000000 --- a/ide/test/trace/database/data-trafic/VmTrackerDataReceiver.test.ts +++ /dev/null @@ -1,136 +0,0 @@ -/* - * Copyright (C) 2022 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 { - abilityDmaDataReceiver, abilityGpuMemoryDataReceiver, - abilityPurgeableDataReceiver, - dmaDataReceiver, - gpuDataReceiver, - gpuMemoryDataReceiver, - gpuResourceDataReceiver, - gpuTotalDataReceiver, - gpuWindowDataReceiver, - purgeableDataReceiver, - shmDataReceiver, - sMapsDataReceiver -} from "../../../../src/trace/database/data-trafic/VmTrackerDataReceiver"; - -describe('VmTrackerDataReceiver Test', () => { - let data = { - action: "exec-proto", - id: "6", - name: 82, - params: { - endNs: 109726762483, - ipid: 1, - recordEndNS: 490640100187894, - recordStartNS: 490530373425411, - sharedArrayBuffers: undefined, - startNs: 0, - trafic: 3, - width: 1424 - } - }; - let res = [{ - trackerData: { - startNs: 4762581249, - value: 108232704 - } - }] - it('VmTrackerDataReceiverTest01', function () { - const mockCallback = jest.fn(() => res); - (self as unknown as Worker).postMessage = jest.fn(); - sMapsDataReceiver(data, mockCallback); - expect(mockCallback).toHaveBeenCalled(); - }); - - it('VmTrackerDataReceiverTest02', function () { - const mockCallback = jest.fn(() => res); - (self as unknown as Worker).postMessage = jest.fn(); - dmaDataReceiver(data, mockCallback); - expect(mockCallback).toHaveBeenCalled(); - }); - - it('VmTrackerDataReceiverTest03', function () { - const mockCallback = jest.fn(() => res); - (self as unknown as Worker).postMessage = jest.fn(); - gpuMemoryDataReceiver(data, mockCallback); - expect(mockCallback).toHaveBeenCalled(); - }); - - it('VmTrackerDataReceiverTest04', function () { - const mockCallback = jest.fn(() => res); - (self as unknown as Worker).postMessage = jest.fn(); - gpuDataReceiver(data, mockCallback); - expect(mockCallback).toHaveBeenCalled(); - }); - - it('VmTrackerDataReceiverTest05', function () { - const mockCallback = jest.fn(() => res); - (self as unknown as Worker).postMessage = jest.fn(); - gpuResourceDataReceiver(data, mockCallback); - expect(mockCallback).toHaveBeenCalled(); - }); - - it('VmTrackerDataReceiverTest06', function () { - const mockCallback = jest.fn(() => res); - (self as unknown as Worker).postMessage = jest.fn(); - gpuTotalDataReceiver(data, mockCallback); - expect(mockCallback).toHaveBeenCalled(); - }); - - it('VmTrackerDataReceiverTest07', function () { - const mockCallback = jest.fn(() => res); - (self as unknown as Worker).postMessage = jest.fn(); - gpuWindowDataReceiver(data, mockCallback); - expect(mockCallback).toHaveBeenCalled(); - }); - - it('VmTrackerDataReceiverTest08', function () { - const mockCallback = jest.fn(() => res); - (self as unknown as Worker).postMessage = jest.fn(); - shmDataReceiver(data, mockCallback); - expect(mockCallback).toHaveBeenCalled(); - }); - - it('VmTrackerDataReceiverTest09', function () { - const mockCallback = jest.fn(() => res); - (self as unknown as Worker).postMessage = jest.fn(); - purgeableDataReceiver(data, mockCallback); - expect(mockCallback).toHaveBeenCalled(); - }); - - it('VmTrackerDataReceiverTest10', function () { - const mockCallback = jest.fn(() => res); - (self as unknown as Worker).postMessage = jest.fn(); - abilityPurgeableDataReceiver(data, mockCallback); - expect(mockCallback).toHaveBeenCalled(); - }); - - it('VmTrackerDataReceiverTest11', function () { - const mockCallback = jest.fn(() => res); - (self as unknown as Worker).postMessage = jest.fn(); - abilityDmaDataReceiver(data, mockCallback); - expect(mockCallback).toHaveBeenCalled(); - }); - - it('VmTrackerDataReceiverTest12', function () { - const mockCallback = jest.fn(() => res); - (self as unknown as Worker).postMessage = jest.fn(); - abilityGpuMemoryDataReceiver(data, mockCallback); - expect(mockCallback).toHaveBeenCalled(); - }); -}); \ No newline at end of file diff --git a/ide/test/trace/database/data-trafic/VmTrackerDataSender.test.ts b/ide/test/trace/database/data-trafic/VmTrackerDataSender.test.ts deleted file mode 100644 index 9123ed13..00000000 --- a/ide/test/trace/database/data-trafic/VmTrackerDataSender.test.ts +++ /dev/null @@ -1,179 +0,0 @@ -/* - * Copyright (C) 2022 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 { TraceRow } from '../../../../src/trace/component/trace/base/TraceRow'; -import { threadPool } from '../../../../src/trace/database/SqlLite'; -import { - abilityDmaDataSender, - abilityGpuMemoryDataSender, - abilityPurgeableDataSender, - dmaDataSender, - gpuGpuDataSender, - gpuMemoryDataSender, - gpuResourceDataSender, - gpuTotalDataSender, - gpuWindowDataSender, - purgeableDataSender, - shmDataSender, - sMapsDataSender -} from '../../../../src/trace/database/data-trafic/VmTrackerDataSender'; -import { SnapshotStruct } from '../../../../src/trace/database/ui-worker/ProcedureWorkerSnapshot'; - -jest.mock('../../../../src/trace/database/ui-worker/ProcedureWorker', () => { - return {}; -}); - -describe('VmTrackerDataSender Test', () => { - let data = [{ - dur: 1000000000, - endNs: 5762581249, - frame: {x: 61, y: 3, width: 13, height: 33}, - name: "SnapShot 1", - startNs: 4762581249, - textWidth: 54.6826171875, - value: 213135360 - }] - it('VmTrackerDataSenderTest01', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(data, data.length, true); - }); - let sMapsTraceRow = TraceRow.skeleton(); - sMapsDataSender('dirty', sMapsTraceRow).then(result => { - expect(result).toHaveLength(1); - expect(threadPool.submitProto).toHaveBeenCalled(); - }); - }); - - it('VmTrackerDataSenderTest02', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(data, data.length, true); - }); - let dmaTraceRow = TraceRow.skeleton(); - dmaDataSender(1, dmaTraceRow).then(result => { - expect(result).toHaveLength(1); - expect(threadPool.submitProto).toHaveBeenCalled(); - }); - }); - - it('VmTrackerDataSenderTest03', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(data, data.length, true); - }); - let gpuMemoryTraceRow = TraceRow.skeleton(); - gpuMemoryDataSender(1, gpuMemoryTraceRow).then(result => { - expect(result).toHaveLength(1); - expect(threadPool.submitProto).toHaveBeenCalled(); - }); - }); - - it('VmTrackerDataSenderTest04', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(data, data.length, true); - }); - let gpuResourceTraceRow = TraceRow.skeleton(); - gpuResourceDataSender(13, gpuResourceTraceRow).then(result => { - expect(result).toHaveLength(1); - expect(threadPool.submitProto).toHaveBeenCalled(); - }); - }); - - it('VmTrackerDataSenderTest05', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(data, data.length, true); - }); - let gpuGpuTraceRow = TraceRow.skeleton(); - gpuGpuDataSender(13, "'mem.graph_pss'", gpuGpuTraceRow).then(result => { - expect(result).toHaveLength(1); - expect(threadPool.submitProto).toHaveBeenCalled(); - }); - }); - - it('VmTrackerDataSenderTest06', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(data, data.length, true); - }); - let gpuTotalTraceRow = TraceRow.skeleton(); - gpuTotalDataSender(13, gpuTotalTraceRow).then(result => { - expect(result).toHaveLength(1); - expect(threadPool.submitProto).toHaveBeenCalled(); - }); - }); - - it('VmTrackerDataSenderTest07', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(data, data.length, true); - }); - let gpuWindowTraceRow = TraceRow.skeleton(); - gpuWindowDataSender(13, 15, gpuWindowTraceRow).then(result => { - expect(result).toHaveLength(1); - expect(threadPool.submitProto).toHaveBeenCalled(); - }); - }); - - it('VmTrackerDataSenderTest08', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(data, data.length, true); - }); - let shmTraceRow = TraceRow.skeleton(); - shmDataSender(13, shmTraceRow).then(result => { - expect(result).toHaveLength(1); - expect(threadPool.submitProto).toHaveBeenCalled(); - }); - }); - - it('VmTrackerDataSenderTest09', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(data, data.length, true); - }); - let purgeableTraceRow = TraceRow.skeleton(); - purgeableDataSender(13, purgeableTraceRow).then(result => { - expect(result).toHaveLength(1); - expect(threadPool.submitProto).toHaveBeenCalled(); - }); - }); - - it('VmTrackerDataSenderTest10', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(data, data.length, true); - }); - let abilityPurgeablTraceRow = TraceRow.skeleton(); - abilityPurgeableDataSender(abilityPurgeablTraceRow, 1000000000, false).then(result => { - expect(result).toHaveLength(1); - expect(threadPool.submitProto).toHaveBeenCalled(); - }); - }); - - it('VmTrackerDataSenderTest11', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(data, data.length, true); - }); - let abilityDmaTraceRow = TraceRow.skeleton(); - abilityDmaDataSender(abilityDmaTraceRow, 1000000000).then(result => { - expect(result).toHaveLength(1); - expect(threadPool.submitProto).toHaveBeenCalled(); - }); - }); - - it('VmTrackerDataSenderTest12', () => { - threadPool.submitProto = jest.fn((query: number, params: any, callback: Function) => { - callback(data, data.length, true); - }); - let abilityGpuMemoryTraceRow = TraceRow.skeleton(); - abilityGpuMemoryDataSender(abilityGpuMemoryTraceRow, 1000000000).then(result => { - expect(result).toHaveLength(1); - expect(threadPool.submitProto).toHaveBeenCalled(); - }); - }); -}); \ No newline at end of file diff --git a/trace_streamer/src/base/index_map.h b/trace_streamer/src/base/index_map.h index 35817e8c..564de376 100644 --- a/trace_streamer/src/base/index_map.h +++ b/trace_streamer/src/base/index_map.h @@ -78,36 +78,44 @@ public: rowIndexBak_.clear(); switch (op) { case SQLITE_INDEX_CONSTRAINT_EQ: - ProcessData(dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] != value; }, - [&](TableRowId id) -> bool { return dataQueue[id] == value; }); + ProcessData( + dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] != value; }, + [&](TableRowId id) -> bool { return dataQueue[id] == value; }); break; case SQLITE_INDEX_CONSTRAINT_NE: - ProcessData(dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] == value; }, - [&](TableRowId id) -> bool { return dataQueue[id] != value; }); + ProcessData( + dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] == value; }, + [&](TableRowId id) -> bool { return dataQueue[id] != value; }); break; case SQLITE_INDEX_CONSTRAINT_ISNULL: - ProcessData(dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] != invalidValue; }, - [&](TableRowId id) -> bool { return dataQueue[id] == invalidValue; }); + ProcessData( + dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] != invalidValue; }, + [&](TableRowId id) -> bool { return dataQueue[id] == invalidValue; }); break; case SQLITE_INDEX_CONSTRAINT_ISNOTNULL: - ProcessData(dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] == invalidValue; }, - [&](TableRowId id) -> bool { return dataQueue[id] != invalidValue; }); + ProcessData( + dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] == invalidValue; }, + [&](TableRowId id) -> bool { return dataQueue[id] != invalidValue; }); break; case SQLITE_INDEX_CONSTRAINT_GT: - ProcessData(dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] <= value; }, - [&](TableRowId id) -> bool { return dataQueue[id] > value; }); + ProcessData( + dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] <= value; }, + [&](TableRowId id) -> bool { return dataQueue[id] > value; }); break; case SQLITE_INDEX_CONSTRAINT_GE: - ProcessData(dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] < value; }, - [&](TableRowId id) -> bool { return dataQueue[id] >= value; }); + ProcessData( + dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] < value; }, + [&](TableRowId id) -> bool { return dataQueue[id] >= value; }); break; case SQLITE_INDEX_CONSTRAINT_LE: - ProcessData(dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] > value; }, - [&](TableRowId id) -> bool { return dataQueue[id] <= value; }); + ProcessData( + dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] > value; }, + [&](TableRowId id) -> bool { return dataQueue[id] <= value; }); break; case SQLITE_INDEX_CONSTRAINT_LT: - ProcessData(dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] >= value; }, - [&](TableRowId id) -> bool { return dataQueue[id] < value; }); + ProcessData( + dataQueue, remove, [&](TableRowId id) -> bool { return dataQueue[id] >= value; }, + [&](TableRowId id) -> bool { return dataQueue[id] < value; }); break; default: break; diff --git a/trace_streamer/src/filter/hi_sysevent_measure_filter.cpp b/trace_streamer/src/filter/hi_sysevent_measure_filter.cpp index 27ea11c2..40842110 100644 --- a/trace_streamer/src/filter/hi_sysevent_measure_filter.cpp +++ b/trace_streamer/src/filter/hi_sysevent_measure_filter.cpp @@ -140,11 +140,15 @@ bool HiSysEventMeasureFilter::SaveAllHiSysEvent(json jMessage, bool& haveSplitSe } return false; } + UpdataAllHiSysEvent(jsMassage, newTimeStamp); + return true; +} +void HiSysEventMeasureFilter::UpdataAllHiSysEvent(const JsonMessage& jsMassage, uint64_t newTimeStamp) +{ traceDataCache_->GetHiSysEventAllEventData()->AppendHiSysEventData( jsMassage.domainId, jsMassage.eventNameId, newTimeStamp, jsMassage.type, jsMassage.timeZone, jsMassage.pid, jsMassage.tid, jsMassage.uid, jsMassage.level, jsMassage.tag, jsMassage.eventId, jsMassage.seq, jsMassage.info, jsMassage.content.dump()); - return true; } bool HiSysEventMeasureFilter::JGetData(const json& jMessage, JsonData& jData, diff --git a/trace_streamer/src/filter/hi_sysevent_measure_filter.h b/trace_streamer/src/filter/hi_sysevent_measure_filter.h index 79250ef3..ee2a87d4 100644 --- a/trace_streamer/src/filter/hi_sysevent_measure_filter.h +++ b/trace_streamer/src/filter/hi_sysevent_measure_filter.h @@ -118,6 +118,7 @@ private: DataIndex eventSourceIndex, DataIndex keyIndex, uint64_t timeStamp); + void UpdataAllHiSysEvent(const JsonMessage& jsMassage, uint64_t newTimeStamp); const uint64_t MSEC_TO_NS = 1000 * 1000; DataIndex GetOrCreateFilterIdInternal(DataIndex appNameId, DataIndex key); DoubleMap appKey_; diff --git a/trace_streamer/src/main.cpp b/trace_streamer/src/main.cpp index 512d3966..c7564d98 100644 --- a/trace_streamer/src/main.cpp +++ b/trace_streamer/src/main.cpp @@ -342,7 +342,35 @@ bool CheckAndSetLongTraceDir(TraceExportOption& traceExportOption, int argc, cha traceExportOption.longTraceDir = std::string(argv[index]); return true; } - +bool ParseOtherArgs(int argc, char** argv, TraceExportOption& traceExportOption, int i) +{ + if (!strcmp(argv[i], "-i") || !strcmp(argv[i], "--info")) { + PrintInformation(); + } else if (!strcmp(argv[i], "-l") || !strcmp(argv[i], "--level")) { + TS_CHECK_TRUE_RET(CheckAndSetLogLevel(argc, argv, i), false); + return true; + } else if (!strcmp(argv[i], "-s") || !strcmp(argv[i], "--s")) { + traceExportOption.separateFile = true; + return true; + } else if (!strcmp(argv[i], "-tn") || !strcmp(argv[i], "--threadnum")) { + TS_CHECK_TRUE_RET(CheckAndSetThreadNum(traceExportOption, argc, argv, i), false); + return true; + } else if (!strcmp(argv[i], "-nt") || !strcmp(argv[i], "--nothreads")) { + traceExportOption.closeMutiThread = true; + return true; + } else if (!strcmp(argv[i], "-nm") || !strcmp(argv[i], "--nometa")) { + traceExportOption.exportMetaTable = false; + return true; + } else if (!strcmp(argv[i], "-m") || !strcmp(argv[i], "--run-metrics")) { + TS_CHECK_TRUE_RET(CheckAndSetMetrics(traceExportOption, argc, argv, i), false); + return true; + } else if (!strcmp(argv[i], "-v") || !strcmp(argv[i], "--version")) { + PrintVersion(); + return false; + } + traceExportOption.traceFilePath = std::string(argv[i]); + return true; +} bool ParseArgs(int argc, char** argv, TraceExportOption& traceExportOption) { for (int i = 1; i < argc; i++) { @@ -364,34 +392,13 @@ bool ParseArgs(int argc, char** argv, TraceExportOption& traceExportOption) } else if (!strcmp(argv[i], "-o") || !strcmp(argv[i], "--out")) { TS_CHECK_TRUE_RET(CheckAndSetOutputFilePath(traceExportOption, argc, argv, i), false); continue; - } else if (!strcmp(argv[i], "-i") || !strcmp(argv[i], "--info")) { - PrintInformation(); - } else if (!strcmp(argv[i], "-l") || !strcmp(argv[i], "--level")) { - TS_CHECK_TRUE_RET(CheckAndSetLogLevel(argc, argv, i), false); - continue; - } else if (!strcmp(argv[i], "-s") || !strcmp(argv[i], "--s")) { - traceExportOption.separateFile = true; - continue; - } else if (!strcmp(argv[i], "-tn") || !strcmp(argv[i], "--threadnum")) { - TS_CHECK_TRUE_RET(CheckAndSetThreadNum(traceExportOption, argc, argv, i), false); - continue; - } else if (!strcmp(argv[i], "-nt") || !strcmp(argv[i], "--nothreads")) { - traceExportOption.closeMutiThread = true; - continue; - } else if (!strcmp(argv[i], "-nm") || !strcmp(argv[i], "--nometa")) { - traceExportOption.exportMetaTable = false; - continue; - } else if (!strcmp(argv[i], "-m") || !strcmp(argv[i], "--run-metrics")) { - TS_CHECK_TRUE_RET(CheckAndSetMetrics(traceExportOption, argc, argv, i), false); - continue; - } else if (!strcmp(argv[i], "-v") || !strcmp(argv[i], "--version")) { - PrintVersion(); + } else if (!ParseOtherArgs(argc, argv, traceExportOption, i)) { return false; } - traceExportOption.traceFilePath = std::string(argv[i]); } return CheckFinal(argv, traceExportOption); } + bool GetLongTraceFilePaths(const TraceExportOption& traceExportOption, std::map& seqToFilePathMap) { std::regex traceInvalidStr("\\\\"); diff --git a/trace_streamer/src/parser/bytrace_parser/bytrace_parser.cpp b/trace_streamer/src/parser/bytrace_parser/bytrace_parser.cpp index 5cc2172b..d23bf8f5 100644 --- a/trace_streamer/src/parser/bytrace_parser/bytrace_parser.cpp +++ b/trace_streamer/src/parser/bytrace_parser/bytrace_parser.cpp @@ -67,6 +67,80 @@ bool BytraceParser::UpdateSplitPos() TS_LOGI("minSplitPos_=%d", minSplitPos_); return true; } + +template +int32_t BytraceParser::WhileDetermine(Iterator& packagesLine, + Iterator& packagesBegin, + bool& isParsingOver_, + bool isFinish) +{ + // While loop break and continue + if (packagesLine == packagesBuffer_.end()) { + if (isFinish) { + isParsingOver_ = true; + } else { + return 1; + } + } + if (packagesLine == packagesBuffer_.begin()) { + packagesLine++; + curFileOffset_ += std::distance(packagesBegin, packagesLine); + packagesBegin = packagesLine; + return DETERMINE_CONTINUE; + } + return DETERMINE_RETURN; +} + +int32_t BytraceParser::GotoDetermine(std::string& bufferLine, bool& haveSplitSeg) +{ + if (traceDataCache_->isSplitFile_) { + mTraceDataBytrace_.emplace_back(curFileOffset_, curDataSize_); + } + if (isFirstLine_) { + isFirstLine_ = false; + if (IsHtmlTrace(bufferLine)) { + isHtmlTrace_ = true; + return 1; + } + } + if (isHtmlTrace_) { + if (!isHtmlTraceContent_) { + if (IsHtmlTraceBegin(bufferLine)) { + isHtmlTraceContent_ = true; + } + return 1; + } + auto pos = bufferLine.find(script_.c_str()); + if (pos != std::string::npos) { + isHtmlTraceContent_ = false; + bufferLine = bufferLine.substr(0, pos); + if (std::all_of(bufferLine.begin(), bufferLine.end(), isspace)) { + return 1; + } + } + } + if (IsTraceComment(bufferLine)) { + traceCommentLines_++; + mTraceDataBytrace_.clear(); + return 1; + } + if (bufferLine.empty()) { + parsedTraceInvalidLines_++; + return 1; + } + if (fileType_ == TRACE_FILETYPE_HILOG) { + hilogParser_->ParseHilogDataItem(bufferLine, seq_, haveSplitSeg); + } else if (fileType_ == TRACE_FILETYPE_HI_SYSEVENT) { + hiSysEventParser_->ParseHiSysEventDataItem(bufferLine, seq_, haveSplitSeg); + } else if (isBytrace_) { + if (!traceBegan_) { + traceBegan_ = true; + } + ParseTraceDataItem(bufferLine); + } + return DETERMINE_RETURN; +} + void BytraceParser::ParseTraceDataSegment(std::unique_ptr bufferStr, size_t size, bool isFinish) { if (isParsingOver_) { @@ -76,76 +150,24 @@ void BytraceParser::ParseTraceDataSegment(std::unique_ptr bufferStr, auto packagesBegin = packagesBuffer_.begin(); while (true) { auto packagesLine = std::find(packagesBegin, packagesBuffer_.end(), '\n'); - if (packagesLine == packagesBuffer_.end()) { - if (isFinish) { - isParsingOver_ = true; - } else { - break; - } - } - if (packagesLine == packagesBuffer_.begin()) { - packagesLine++; - curFileOffset_ += std::distance(packagesBegin, packagesLine); - packagesBegin = packagesLine; + int32_t determine = WhileDetermine(packagesLine, packagesBegin, isParsingOver_, isFinish); + if (1 == determine) { + break; + } else if (DETERMINE_CONTINUE == determine) { continue; } // Support parsing windows file format(ff=dos) auto extra = 0; - if (packagesLine != packagesBuffer_.end()) { - if (*(packagesLine - 1) == '\r') { - extra = 1; - } + if (packagesLine != packagesBuffer_.end() && *(packagesLine - 1) == '\r') { + extra = 1; } bool haveSplitSeg = false; std::string bufferLine(packagesBegin, packagesLine - extra); curDataSize_ = std::distance(packagesBegin, packagesLine) + 1; - if (traceDataCache_->isSplitFile_) { - mTraceDataBytrace_.emplace_back(curFileOffset_, curDataSize_); - } - - if (isFirstLine_) { - isFirstLine_ = false; - if (IsHtmlTrace(bufferLine)) { - isHtmlTrace_ = true; - goto NEXT_LINE; - } - } - if (isHtmlTrace_) { - if (!isHtmlTraceContent_) { - if (IsHtmlTraceBegin(bufferLine)) { - isHtmlTraceContent_ = true; - } - goto NEXT_LINE; - } - auto pos = bufferLine.find(script_.c_str()); - if (pos != std::string::npos) { - isHtmlTraceContent_ = false; - bufferLine = bufferLine.substr(0, pos); - if (std::all_of(bufferLine.begin(), bufferLine.end(), isspace)) { - goto NEXT_LINE; - } - } - } - - if (IsTraceComment(bufferLine)) { - traceCommentLines_++; - mTraceDataBytrace_.clear(); + int32_t op = GotoDetermine(bufferLine, haveSplitSeg); + if (1 == op) { goto NEXT_LINE; } - if (bufferLine.empty()) { - parsedTraceInvalidLines_++; - goto NEXT_LINE; - } - if (fileType_ == TRACE_FILETYPE_HILOG) { - hilogParser_->ParseHilogDataItem(bufferLine, seq_, haveSplitSeg); - } else if (fileType_ == TRACE_FILETYPE_HI_SYSEVENT) { - hiSysEventParser_->ParseHiSysEventDataItem(bufferLine, seq_, haveSplitSeg); - } else if (isBytrace_) { - if (!traceBegan_) { - traceBegan_ = true; - } - ParseTraceDataItem(bufferLine); - } if (haveSplitSeg) { UpdateSplitPos(); } @@ -158,7 +180,6 @@ void BytraceParser::ParseTraceDataSegment(std::unique_ptr bufferStr, seq_++; continue; } - if (isParsingOver_) { packagesBuffer_.clear(); } else { diff --git a/trace_streamer/src/parser/bytrace_parser/bytrace_parser.h b/trace_streamer/src/parser/bytrace_parser/bytrace_parser.h index a73a3d7c..0aabfdf0 100644 --- a/trace_streamer/src/parser/bytrace_parser/bytrace_parser.h +++ b/trace_streamer/src/parser/bytrace_parser/bytrace_parser.h @@ -32,6 +32,8 @@ namespace SysTuning { namespace TraceStreamer { +constexpr int32_t DETERMINE_CONTINUE = 2; +constexpr int32_t DETERMINE_RETURN = 3; class BytraceParser : public ParserBase { public: BytraceParser(TraceDataCache* dataCache, @@ -39,6 +41,10 @@ public: TraceFileType fileType = TRACE_FILETYPE_BY_TRACE); ~BytraceParser(); + template + int32_t WhileDetermine(Iterator& determine, Iterator& packagesBegin, bool& isParsingOver_, bool isFinish); + int32_t GotoDetermine(std::string& bufferLine, bool& haveSplitSeg); + void ParseTraceDataSegment(std::unique_ptr bufferStr, size_t size, bool isFinish = false) override; size_t ParsedTraceValidLines() const { diff --git a/trace_streamer/src/parser/htrace_pbreader_parser/htrace_mem_parser.cpp b/trace_streamer/src/parser/htrace_pbreader_parser/htrace_mem_parser.cpp index d68072e4..d267f4f3 100644 --- a/trace_streamer/src/parser/htrace_pbreader_parser/htrace_mem_parser.cpp +++ b/trace_streamer/src/parser/htrace_pbreader_parser/htrace_mem_parser.cpp @@ -1155,54 +1155,41 @@ void HtraceMemParser::ParseVMemInfo(const ProtoReader::MemoryData_Reader* traceP ProtoReader::SysVMeminfo_Reader sysVMeminfo(i->ToBytes()); if (sysVMeminfo.key() >= ProtoReader::VMEMINFO_UNSPECIFIED && sysVMeminfo.key() <= ProtoReader::VMEMINFO_NR_ANON_PAGES) { - // key 0 <----> 9 ParseVMemInfoOne(sysVMeminfo, timeStamp); } else if (sysVMeminfo.key() >= ProtoReader::VMEMINFO_NR_MAPPED && sysVMeminfo.key() <= ProtoReader::VMEMINFO_NR_UNSTABLE) { - // key 10 <----> 19 ParseVMemInfoTwo(sysVMeminfo, timeStamp); } else if (sysVMeminfo.key() >= ProtoReader::VMEMINFO_NR_BOUNCE && sysVMeminfo.key() <= ProtoReader::VMEMINFO_NR_PAGES_SCANNED) { - // key 20 <----> 29 ParseVMemInfoThree(sysVMeminfo, timeStamp); } else if (sysVMeminfo.key() >= ProtoReader::VMEMINFO_WORKINGSET_REFAULT && sysVMeminfo.key() <= ProtoReader::VMEMINFO_PGPGOUT) { - // key 30 <----> 39 ParseVMemInfoFour(sysVMeminfo, timeStamp); } else if (sysVMeminfo.key() >= ProtoReader::VMEMINFO_PGPGOUTCLEAN && sysVMeminfo.key() <= ProtoReader::VMEMINFO_PGFAULT) { - // key 40 <----> 49 ParseVMemInfoFive(sysVMeminfo, timeStamp); } else if (sysVMeminfo.key() >= ProtoReader::VMEMINFO_PGMAJFAULT && sysVMeminfo.key() <= ProtoReader::VMEMINFO_PGSTEAL_DIRECT_MOVABLE) { - // key 50 <----> 59 ParseVMemInfoSix(sysVMeminfo, timeStamp); } else if (sysVMeminfo.key() >= ProtoReader::VMEMINFO_PGSCAN_KSWAPD_DMA && sysVMeminfo.key() <= ProtoReader::VMEMINFO_KSWAPD_INODESTEAL) { - // key 60 <----> 69 ParseVMemInfoSeven(sysVMeminfo, timeStamp); } else if (sysVMeminfo.key() >= ProtoReader::VMEMINFO_KSWAPD_LOW_WMARK_HIT_QUICKLY && sysVMeminfo.key() <= ProtoReader::VMEMINFO_COMPACT_MIGRATE_SCANNED) { - // key 70 <----> 79 ParseVMemInfoEight(sysVMeminfo, timeStamp); } else if (sysVMeminfo.key() >= ProtoReader::VMEMINFO_COMPACT_FREE_SCANNED && sysVMeminfo.key() <= ProtoReader::VMEMINFO_UNEVICTABLE_PGS_MLOCKED) { - // key 80 <----> 89 ParseVMemInfoNine(sysVMeminfo, timeStamp); } else if (sysVMeminfo.key() >= ProtoReader::VMEMINFO_UNEVICTABLE_PGS_MUNLOCKED && sysVMeminfo.key() <= ProtoReader::VMEMINFO_COMPACT_DAEMON_FREE_SCANNED) { - // key 90 <----> 99 ParseVMemInfoTen(sysVMeminfo, timeStamp); } else if (sysVMeminfo.key() >= ProtoReader::VMEMINFO_COMPACT_DAEMON_MIGRATE_SCANNED && sysVMeminfo.key() <= ProtoReader::VMEMINFO_NR_ZONE_ACTIVE_ANON) { - // key 100 <----> 109 ParseVMemInfoEleven(sysVMeminfo, timeStamp); } else if (sysVMeminfo.key() >= ProtoReader::VMEMINFO_NR_ZONE_ACTIVE_FILE && sysVMeminfo.key() <= ProtoReader::VMEMINFO_PGSCAN_DIRECT) { - // key 110 <----> 119 ParseVMemInfoTwelve(sysVMeminfo, timeStamp); } else { - // key 120 <----> ParseVMemInfoThirteen(sysVMeminfo, timeStamp); } } diff --git a/trace_streamer/src/parser/htrace_pbreader_parser/htrace_parser.cpp b/trace_streamer/src/parser/htrace_pbreader_parser/htrace_parser.cpp index 694af5e4..f6966e33 100644 --- a/trace_streamer/src/parser/htrace_pbreader_parser/htrace_parser.cpp +++ b/trace_streamer/src/parser/htrace_pbreader_parser/htrace_parser.cpp @@ -260,7 +260,7 @@ void HtraceParser::FilterData(HtraceDataSegment& seg, bool isSplitFile) htraceMemParser_->ParseMemoryConfig(seg); } if (traceDataCache_->isSplitFile_ && haveSplitSeg) { - mTraceDataHtrace_.emplace(splitFileOffset_, nextLength_ + packetSegLength); + mTraceDataHtrace_.emplace(splitFileOffset_, nextLength_ + packetSegLength_); } if (traceDataCache_->supportThread_ && !traceDataCache_->isSplitFile_) { filterHead_ = (filterHead_ + 1) % maxSegArraySize; @@ -303,7 +303,7 @@ bool HtraceParser::SpliteConfigData(const std::string& pluginName, const HtraceD arkTsConfigData_ = lenBuffer_ + dataString; return true; } else if (EndWith(pluginName, "config")) { - mTraceDataHtrace_.emplace(splitFileOffset_, nextLength_ + packetSegLength); + mTraceDataHtrace_.emplace(splitFileOffset_, nextLength_ + packetSegLength_); return true; } return false; @@ -322,7 +322,7 @@ bool HtraceParser::SpliteDataBySegment(DataIndex pluginNameIndex, HtraceDataSegm } if (dataSeg.timeStamp >= traceDataCache_->SplitFileMinTime() && dataSeg.timeStamp <= traceDataCache_->SplitFileMaxTime()) { - mTraceDataHtrace_.emplace(splitFileOffset_, nextLength_ + packetSegLength); + mTraceDataHtrace_.emplace(splitFileOffset_, nextLength_ + packetSegLength_); } if (pluginNameIndex == arktsPluginConfigIndex_ || pluginNameIndex == arktsPluginIndex_) { return false; @@ -507,7 +507,7 @@ void HtraceParser::ParseFtrace(HtraceDataSegment& dataSeg) dataSeg.status = TS_PARSE_STATUS_PARSED; } if (traceDataCache_->isSplitFile_ && haveSplitSeg) { - mTraceDataHtrace_.emplace(splitFileOffset_, nextLength_ + packetSegLength); + mTraceDataHtrace_.emplace(splitFileOffset_, nextLength_ + packetSegLength_); } dataSeg.status = TS_PARSE_STATUS_INVALID; } @@ -601,14 +601,14 @@ int32_t HtraceParser::GetNextSegment() } bool HtraceParser::CalcEbpfCutOffset(std::deque::iterator& packagesBegin, size_t& currentLength) { - auto standaloneDataLength = profilerDataLength_ - packetHeaderLength; + auto standaloneDataLength = profilerDataLength_ - packetHeaderLength_; if (traceDataCache_->isSplitFile_ && !parsedEbpfOver_) { if (!hasInitEbpfPublicData_) { // Record the offset of Hiperf's 1024-byte header relative to the entire file. ebpfDataParser_->SetEbpfDataOffset(processedDataLen_); ebpfDataParser_->SetSpliteTimeRange(traceDataCache_->SplitFileMinTime(), traceDataCache_->SplitFileMaxTime()); - parsedFileOffset_ += profilerDataLength_ - packetHeaderLength; + parsedFileOffset_ += profilerDataLength_ - packetHeaderLength_; hasInitEbpfPublicData_ = true; } parsedEbpfOver_ = ebpfDataParser_->AddAndSplitEbpfData(packagesBuffer_); @@ -630,25 +630,68 @@ bool HtraceParser::CalcEbpfCutOffset(std::deque::iterator& packagesBegi return false; } -bool HtraceParser::ParseDataRecursively(std::deque::iterator& packagesBegin, size_t& currentLength) +bool HtraceParser::GetHeaderAndUpdateLengthMark(std::deque::iterator& packagesBegin, size_t& currentLength) { if (!hasGotHeader_) { - if (InitProfilerTraceFileHeader()) { - packagesBuffer_.erase(packagesBuffer_.begin(), packagesBuffer_.begin() + packetHeaderLength); - processedDataLen_ += packetHeaderLength; - currentLength -= packetHeaderLength; - packagesBegin += packetHeaderLength; - parsedFileOffset_ += packetHeaderLength; - htraceCurentLength_ = profilerDataLength_; - htraceCurentLength_ -= packetHeaderLength; - hasGotHeader_ = true; - if (!currentLength) { - return false; - } - } else { + if (!InitProfilerTraceFileHeader()) { + return false; + } + packagesBuffer_.erase(packagesBuffer_.begin(), packagesBuffer_.begin() + packetHeaderLength_); + processedDataLen_ += packetHeaderLength_; + currentLength -= packetHeaderLength_; + packagesBegin += packetHeaderLength_; + parsedFileOffset_ += packetHeaderLength_; + htraceCurentLength_ = profilerDataLength_; + htraceCurentLength_ -= packetHeaderLength_; + hasGotHeader_ = true; + if (!currentLength) { return false; } } + return true; +} +#if IS_WASM +bool HtraceParser::ParseSDKData() +{ + if (packagesBuffer_.size() >= profilerDataLength_ - packetHeaderLength_) { + auto thirdPartySize = profilerDataLength_ - packetHeaderLength_; + auto buffer = std::make_unique(thirdPartySize).get(); + std::copy(packagesBuffer_.begin(), packagesBuffer_.begin() + thirdPartySize, buffer); + TraceStreamer_Plugin_Out_Filter(reinterpret_cast(buffer), thirdPartySize, standalonePluginName_); + return true; + } + return false; +} +#endif + +bool HtraceParser::ParseSegLengthAndEnsureSegDataEnough(std::deque::iterator& packagesBegin, + size_t& currentLength) +{ + std::string bufferLine; + if (!hasGotSegLength_) { + if (currentLength < packetSegLength_) { + return false; + } + bufferLine.assign(packagesBegin, packagesBegin + packetSegLength_); + const uint32_t* len = reinterpret_cast(bufferLine.data()); + nextLength_ = *len; + lenBuffer_ = bufferLine; + htraceLength_ += nextLength_ + packetSegLength_; + hasGotSegLength_ = true; + currentLength -= packetSegLength_; + packagesBegin += packetSegLength_; + parsedFileOffset_ += packetSegLength_; + splitFileOffset_ = profilerDataLength_ - htraceCurentLength_; + htraceCurentLength_ -= packetSegLength_; + } + if (currentLength < nextLength_) { + return false; + } + return true; +} +bool HtraceParser::ParseDataRecursively(std::deque::iterator& packagesBegin, size_t& currentLength) +{ + TS_CHECK_TRUE_RET(GetHeaderAndUpdateLengthMark(packagesBegin, currentLength), false); if (profilerDataType_ == ProfilerTraceFileHeader::HIPERF_DATA) { return ParseHiperfData(packagesBegin, currentLength); } @@ -657,38 +700,13 @@ bool HtraceParser::ParseDataRecursively(std::deque::iterator& packagesB return CalcEbpfCutOffset(packagesBegin, currentLength); } else { #if IS_WASM - if (packagesBuffer_.size() >= profilerDataLength_ - packetHeaderLength) { - auto thirdPartySize = profilerDataLength_ - packetHeaderLength; - auto buffer = std::make_unique(thirdPartySize).get(); - std::copy(packagesBuffer_.begin(), packagesBuffer_.begin() + thirdPartySize, buffer); - TraceStreamer_Plugin_Out_Filter(reinterpret_cast(buffer), thirdPartySize, - standalonePluginName_); - return true; - } + TS_CHECK_TRUE_RET(ParseSDKData(), false); // 三方sdk逻辑待验证。 #endif } } std::string bufferLine; while (true) { - if (!hasGotSegLength_) { - if (currentLength < packetSegLength) { - break; - } - bufferLine.assign(packagesBegin, packagesBegin + packetSegLength); - const uint32_t* len = reinterpret_cast(bufferLine.data()); - nextLength_ = *len; - lenBuffer_ = bufferLine; - htraceLength_ += nextLength_ + packetSegLength; - hasGotSegLength_ = true; - currentLength -= packetSegLength; - packagesBegin += packetSegLength; - parsedFileOffset_ += packetSegLength; - splitFileOffset_ = profilerDataLength_ - htraceCurentLength_; - htraceCurentLength_ -= packetSegLength; - } - if (currentLength < nextLength_) { - break; - } + TS_CHECK_TRUE_RET(ParseSegLengthAndEnsureSegDataEnough(packagesBegin, currentLength), true); bufferLine.assign(packagesBegin, packagesBegin + nextLength_); ParseTraceDataItem(bufferLine); hasGotSegLength_ = false; @@ -726,8 +744,8 @@ void HtraceParser::ParseTraceDataSegment(std::unique_ptr bufferStr, s bool HtraceParser::ParseHiperfData(std::deque::iterator& packagesBegin, size_t& currentLength) { if (!traceDataCache_->isSplitFile_) { - if (packagesBuffer_.size() >= profilerDataLength_ - packetHeaderLength) { - auto size = profilerDataLength_ - packetHeaderLength; + if (packagesBuffer_.size() >= profilerDataLength_ - packetHeaderLength_) { + auto size = profilerDataLength_ - packetHeaderLength_; (void)perfDataParser_->InitPerfDataAndLoad(packagesBuffer_, size, processedDataLen_, false, true); currentLength -= size; packagesBegin += size; @@ -738,10 +756,10 @@ bool HtraceParser::ParseHiperfData(std::deque::iterator& packagesBegin, return false; } - bool isFinish = perfProcessedLen_ + packagesBuffer_.size() >= profilerDataLength_ - packetHeaderLength; + bool isFinish = perfProcessedLen_ + packagesBuffer_.size() >= profilerDataLength_ - packetHeaderLength_; auto size = packagesBuffer_.size(); if (isFinish) { - size = profilerDataLength_ - packetHeaderLength - perfProcessedLen_; + size = profilerDataLength_ - packetHeaderLength_ - perfProcessedLen_; } auto ret = perfDataParser_->InitPerfDataAndLoad(packagesBuffer_, size, processedDataLen_, true, isFinish); perfProcessedLen_ += ret; @@ -776,29 +794,29 @@ void HtraceParser::TraceDataSegmentEnd(bool isSplitFile) bool HtraceParser::InitProfilerTraceFileHeader() { - if (packagesBuffer_.size() < packetHeaderLength) { + if (packagesBuffer_.size() < packetHeaderLength_) { TS_LOGI("buffer size less than profiler trace file header"); return false; } - uint8_t buffer[packetHeaderLength]; + uint8_t buffer[packetHeaderLength_]; (void)memset_s(buffer, sizeof(buffer), 0, sizeof(buffer)); int32_t i = 0; - for (auto it = packagesBuffer_.begin(); it != packagesBuffer_.begin() + packetHeaderLength; ++it, ++i) { + for (auto it = packagesBuffer_.begin(); it != packagesBuffer_.begin() + packetHeaderLength_; ++it, ++i) { buffer[i] = *it; } ProfilerTraceFileHeader* pHeader = reinterpret_cast(buffer); - if (pHeader->data.length <= packetHeaderLength || pHeader->data.magic != ProfilerTraceFileHeader::HEADER_MAGIC) { + if (pHeader->data.length <= packetHeaderLength_ || pHeader->data.magic != ProfilerTraceFileHeader::HEADER_MAGIC) { TS_LOGE("Profiler Trace data is truncated or invalid magic! len = %" PRIu64 ", maigc = %" PRIx64 "", pHeader->data.length, pHeader->data.magic); return false; } if (pHeader->data.dataType == ProfilerTraceFileHeader::HIPERF_DATA) { - perfDataParser_->RecordPerfProfilerHeader(buffer, packetHeaderLength); + perfDataParser_->RecordPerfProfilerHeader(buffer, packetHeaderLength_); } else if (pHeader->data.dataType == ProfilerTraceFileHeader::STANDALONE_DATA && EBPF_PLUGIN_NAME.compare(pHeader->data.standalonePluginName) == 0) { - ebpfDataParser_->RecordEbpfProfilerHeader(buffer, packetHeaderLength); + ebpfDataParser_->RecordEbpfProfilerHeader(buffer, packetHeaderLength_); } else { - auto ret = memcpy_s(&profilerTraceFileHeader_, sizeof(profilerTraceFileHeader_), buffer, packetHeaderLength); + auto ret = memcpy_s(&profilerTraceFileHeader_, sizeof(profilerTraceFileHeader_), buffer, packetHeaderLength_); if (ret == -1 || profilerTraceFileHeader_.data.magic != ProfilerTraceFileHeader::HEADER_MAGIC) { TS_LOGE("Get profiler trace file header failed! ret = %d, magic = %" PRIx64 "", ret, profilerTraceFileHeader_.data.magic); @@ -814,7 +832,7 @@ bool HtraceParser::InitProfilerTraceFileHeader() pHeader->data.length, pHeader->data.dataType, pHeader->data.boottime); #if IS_WASM const int32_t DATA_TYPE_CLOCK = 100; - TraceStreamer_Plugin_Out_SendData(reinterpret_cast(buffer), packetHeaderLength, DATA_TYPE_CLOCK); + TraceStreamer_Plugin_Out_SendData(reinterpret_cast(buffer), packetHeaderLength_, DATA_TYPE_CLOCK); #endif htraceClockDetailParser_->Parse(pHeader); return true; diff --git a/trace_streamer/src/parser/htrace_pbreader_parser/htrace_parser.h b/trace_streamer/src/parser/htrace_pbreader_parser/htrace_parser.h index d0aa81b9..f79cc848 100644 --- a/trace_streamer/src/parser/htrace_pbreader_parser/htrace_parser.h +++ b/trace_streamer/src/parser/htrace_pbreader_parser/htrace_parser.h @@ -118,7 +118,12 @@ private: void ParserData(HtraceDataSegment& dataSeg, bool isSplitFile); private: +#if IS_WASM + bool ParseSDKData(); +#endif void InitPluginNameIndex(); + bool GetHeaderAndUpdateLengthMark(std::deque::iterator& packagesBegin, size_t& currentLength); + bool ParseSegLengthAndEnsureSegDataEnough(std::deque::iterator& packagesBegin, size_t& currentLength); void ParseMemory(const ProtoReader::ProfilerPluginData_Reader& pluginDataZero, HtraceDataSegment& dataSeg); void ParseMemoryConfig(HtraceDataSegment& dataSeg, const ProtoReader::ProfilerPluginData_Reader& pluginDataZero); void ParseHilog(HtraceDataSegment& dataSeg); @@ -154,8 +159,8 @@ private: bool hasGotSegLength_ = false; bool hasGotHeader_ = false; uint32_t nextLength_ = 0; - const size_t packetSegLength = 4; - const size_t packetHeaderLength = 1024; + const size_t packetSegLength_ = 4; + const size_t packetHeaderLength_ = 1024; TraceDataCache* traceDataCache_; std::unique_ptr htraceCpuDetailParser_; std::unique_ptr htraceSymbolsDetailParser_; diff --git a/trace_streamer/src/parser/rawtrace_parser/cpu_detail_parser.cpp b/trace_streamer/src/parser/rawtrace_parser/cpu_detail_parser.cpp index 35a815b3..5bec4c76 100644 --- a/trace_streamer/src/parser/rawtrace_parser/cpu_detail_parser.cpp +++ b/trace_streamer/src/parser/rawtrace_parser/cpu_detail_parser.cpp @@ -40,6 +40,10 @@ CpuDetailParser::CpuDetailParser(TraceDataCache* dataCache, const TraceStreamerF printEventParser_.SetTraceType(TRACE_FILETYPE_RAW_TRACE); printEventParser_.SetTraceClockId(clock_); eventToFunctionMap_ = { + {config_.eventNameMap_.at(TRACE_EVENT_TASK_RENAME), + std::bind(&CpuDetailParser::TaskRenameEvent, this, std::placeholders::_1)}, + {config_.eventNameMap_.at(TRACE_EVENT_TASK_NEWTASK), + std::bind(&CpuDetailParser::TaskNewtaskEvent, this, std::placeholders::_1)}, {config_.eventNameMap_.at(TRACE_EVENT_SCHED_SWITCH), std::bind(&CpuDetailParser::SchedSwitchEvent, this, std::placeholders::_1)}, {config_.eventNameMap_.at(TRACE_EVENT_SCHED_BLOCKED_REASON), @@ -52,70 +56,99 @@ CpuDetailParser::CpuDetailParser(TraceDataCache* dataCache, const TraceStreamerF std::bind(&CpuDetailParser::SchedWakeupNewEvent, this, std::placeholders::_1)}, {config_.eventNameMap_.at(TRACE_EVENT_PROCESS_EXIT), std::bind(&CpuDetailParser::ProcessExitEvent, this, std::placeholders::_1)}, - {config_.eventNameMap_.at(TRACE_EVENT_PROCESS_FREE), - std::bind(&CpuDetailParser::ProcessFreeEvent, this, std::placeholders::_1)}, - {config_.eventNameMap_.at(TRACE_EVENT_BINDER_TRANSACTION), - std::bind(&CpuDetailParser::BinderTractionEvent, this, std::placeholders::_1)}, - {config_.eventNameMap_.at(TRACE_EVENT_BINDER_TRANSACTION_RECEIVED), - std::bind(&CpuDetailParser::BinderTractionReceivedEvent, this, std::placeholders::_1)}, - {config_.eventNameMap_.at(TRACE_EVENT_BINDER_TRANSACTION_ALLOC_BUF), - std::bind(&CpuDetailParser::BinderTractionAllocBufEvent, this, std::placeholders::_1)}, - {config_.eventNameMap_.at(TRACE_EVENT_BINDER_TRANSACTION_LOCK), - std::bind(&CpuDetailParser::BinderTractionLockEvent, this, std::placeholders::_1)}, - {config_.eventNameMap_.at(TRACE_EVENT_BINDER_TRANSACTION_LOCKED), - std::bind(&CpuDetailParser::BinderTractionLockedEvent, this, std::placeholders::_1)}, - {config_.eventNameMap_.at(TRACE_EVENT_BINDER_TRANSACTION_UNLOCK), - std::bind(&CpuDetailParser::BinderTractionUnLockEvent, this, std::placeholders::_1)}, - {config_.eventNameMap_.at(TRACE_EVENT_TASK_RENAME), - std::bind(&CpuDetailParser::TaskRenameEvent, this, std::placeholders::_1)}, - {config_.eventNameMap_.at(TRACE_EVENT_TASK_NEWTASK), - std::bind(&CpuDetailParser::TaskNewtaskEvent, this, std::placeholders::_1)}, - {config_.eventNameMap_.at(TRACE_EVENT_PRINT), - std::bind(&CpuDetailParser::ParseTracingMarkWriteOrPrintEvent, this, std::placeholders::_1)}, - {config_.eventNameMap_.at(TRACE_EVENT_TRACING_MARK_WRITE), - std::bind(&CpuDetailParser::ParseTracingMarkWriteOrPrintEvent, this, std::placeholders::_1)}, - {config_.eventNameMap_.at(TRACE_EVENT_CPU_IDLE), - std::bind(&CpuDetailParser::CpuIdleEvent, this, std::placeholders::_1)}, - {config_.eventNameMap_.at(TRACE_EVENT_CPU_FREQUENCY), - std::bind(&CpuDetailParser::CpuFrequencyEvent, this, std::placeholders::_1)}, - {config_.eventNameMap_.at(TRACE_EVENT_CPU_FREQUENCY_LIMITS), - std::bind(&CpuDetailParser::CpuFrequencyLimitsEvent, this, std::placeholders::_1)}, - {config_.eventNameMap_.at(TRACE_EVENT_SUSPEND_RESUME), - std::bind(&CpuDetailParser::SuspendResumeEvent, this, std::placeholders::_1)}, - {config_.eventNameMap_.at(TRACE_EVENT_WORKQUEUE_EXECUTE_START), - std::bind(&CpuDetailParser::WorkqueueExecuteStartEvent, this, std::placeholders::_1)}, - {config_.eventNameMap_.at(TRACE_EVENT_WORKQUEUE_EXECUTE_END), - std::bind(&CpuDetailParser::WorkqueueExecuteEndEvent, this, std::placeholders::_1)}, - {config_.eventNameMap_.at(TRACE_EVENT_IRQ_HANDLER_ENTRY), - std::bind(&CpuDetailParser::IrqHandlerEntryEvent, this, std::placeholders::_1)}, - {config_.eventNameMap_.at(TRACE_EVENT_IRQ_HANDLER_EXIT), - std::bind(&CpuDetailParser::IrqHandlerExitEvent, this, std::placeholders::_1)}, {config_.eventNameMap_.at(TRACE_EVENT_IPI_ENTRY), std::bind(&CpuDetailParser::IpiHandlerEntryEvent, this, std::placeholders::_1)}, {config_.eventNameMap_.at(TRACE_EVENT_IPI_EXIT), std::bind(&CpuDetailParser::IpiHandlerExitEvent, this, std::placeholders::_1)}, - {config_.eventNameMap_.at(TRACE_EVENT_SOFTIRQ_ENTRY), - std::bind(&CpuDetailParser::SoftIrqEntryEvent, this, std::placeholders::_1)}, - {config_.eventNameMap_.at(TRACE_EVENT_SOFTIRQ_RAISE), - std::bind(&CpuDetailParser::SoftIrqRaiseEvent, this, std::placeholders::_1)}, - {config_.eventNameMap_.at(TRACE_EVENT_SOFTIRQ_EXIT), - std::bind(&CpuDetailParser::SoftIrqExitEvent, this, std::placeholders::_1)}, - {config_.eventNameMap_.at(TRACE_EVENT_CLOCK_SET_RATE), - std::bind(&CpuDetailParser::SetRateEvent, this, std::placeholders::_1)}, - {config_.eventNameMap_.at(TRACE_EVENT_CLOCK_ENABLE), - std::bind(&CpuDetailParser::ClockEnableEvent, this, std::placeholders::_1)}, - {config_.eventNameMap_.at(TRACE_EVENT_CLOCK_DISABLE), - std::bind(&CpuDetailParser::ClockDisableEvent, this, std::placeholders::_1)}, - {config_.eventNameMap_.at(TRACE_EVENT_REGULATOR_SET_VOLTAGE), - std::bind(&CpuDetailParser::RegulatorSetVoltageEvent, this, std::placeholders::_1)}, - {config_.eventNameMap_.at(TRACE_EVENT_REGULATOR_SET_VOLTAGE_COMPLETE), - std::bind(&CpuDetailParser::RegulatorSetVoltageCompleteEvent, this, std::placeholders::_1)}, - {config_.eventNameMap_.at(TRACE_EVENT_REGULATOR_DISABLE), - std::bind(&CpuDetailParser::RegulatorDisableEvent, this, std::placeholders::_1)}, - {config_.eventNameMap_.at(TRACE_EVENT_REGULATOR_DISABLE_COMPLETE), - std::bind(&CpuDetailParser::RegulatorDisableCompleteEvent, this, std::placeholders::_1)}, + {config_.eventNameMap_.at(TRACE_EVENT_PROCESS_FREE), + std::bind(&CpuDetailParser::ProcessFreeEvent, this, std::placeholders::_1)}, + {config_.eventNameMap_.at(TRACE_EVENT_SUSPEND_RESUME), + std::bind(&CpuDetailParser::SuspendResumeEvent, this, std::placeholders::_1)}, + {config_.eventNameMap_.at(TRACE_EVENT_TRACING_MARK_WRITE), + std::bind(&CpuDetailParser::ParseTracingMarkWriteOrPrintEvent, this, std::placeholders::_1)}, }; + InterruptEventInitialization(); + ClockEventInitialization(); + CpuEventInitialization(); + LockEventInitialization(); + BinderEventInitialization(); + StackEventsInitialization(); + VoltageEventInitialization(); } + +void CpuDetailParser::InterruptEventInitialization() +{ + eventToFunctionMap_.emplace(config_.eventNameMap_.at(TRACE_EVENT_IRQ_HANDLER_ENTRY), + std::bind(&CpuDetailParser::IrqHandlerEntryEvent, this, std::placeholders::_1)); + eventToFunctionMap_.emplace(config_.eventNameMap_.at(TRACE_EVENT_IRQ_HANDLER_EXIT), + std::bind(&CpuDetailParser::IrqHandlerExitEvent, this, std::placeholders::_1)); + eventToFunctionMap_.emplace(config_.eventNameMap_.at(TRACE_EVENT_SOFTIRQ_RAISE), + std::bind(&CpuDetailParser::SoftIrqRaiseEvent, this, std::placeholders::_1)); + eventToFunctionMap_.emplace(config_.eventNameMap_.at(TRACE_EVENT_SOFTIRQ_ENTRY), + std::bind(&CpuDetailParser::SoftIrqEntryEvent, this, std::placeholders::_1)); + eventToFunctionMap_.emplace(config_.eventNameMap_.at(TRACE_EVENT_SOFTIRQ_EXIT), + std::bind(&CpuDetailParser::SoftIrqExitEvent, this, std::placeholders::_1)); +} +void CpuDetailParser::ClockEventInitialization() +{ + eventToFunctionMap_.emplace(config_.eventNameMap_.at(TRACE_EVENT_CLOCK_SET_RATE), + std::bind(&CpuDetailParser::SetRateEvent, this, std::placeholders::_1)); + eventToFunctionMap_.emplace(config_.eventNameMap_.at(TRACE_EVENT_CLOCK_ENABLE), + std::bind(&CpuDetailParser::ClockEnableEvent, this, std::placeholders::_1)); + eventToFunctionMap_.emplace(config_.eventNameMap_.at(TRACE_EVENT_CLOCK_DISABLE), + std::bind(&CpuDetailParser::ClockDisableEvent, this, std::placeholders::_1)); +} +void CpuDetailParser::CpuEventInitialization() +{ + eventToFunctionMap_.emplace(config_.eventNameMap_.at(TRACE_EVENT_CPU_IDLE), + std::bind(&CpuDetailParser::CpuIdleEvent, this, std::placeholders::_1)); + eventToFunctionMap_.emplace(config_.eventNameMap_.at(TRACE_EVENT_CPU_FREQUENCY), + std::bind(&CpuDetailParser::CpuFrequencyEvent, this, std::placeholders::_1)); + eventToFunctionMap_.emplace(config_.eventNameMap_.at(TRACE_EVENT_CPU_FREQUENCY_LIMITS), + std::bind(&CpuDetailParser::CpuFrequencyLimitsEvent, this, std::placeholders::_1)); +} +void CpuDetailParser::LockEventInitialization() +{ + eventToFunctionMap_.emplace(config_.eventNameMap_.at(TRACE_EVENT_BINDER_TRANSACTION_LOCK), + std::bind(&CpuDetailParser::BinderTractionLockEvent, this, std::placeholders::_1)); + eventToFunctionMap_.emplace(config_.eventNameMap_.at(TRACE_EVENT_BINDER_TRANSACTION_LOCKED), + std::bind(&CpuDetailParser::BinderTractionLockedEvent, this, std::placeholders::_1)); + eventToFunctionMap_.emplace(config_.eventNameMap_.at(TRACE_EVENT_BINDER_TRANSACTION_UNLOCK), + std::bind(&CpuDetailParser::BinderTractionUnLockEvent, this, std::placeholders::_1)); +} +void CpuDetailParser::BinderEventInitialization() +{ + eventToFunctionMap_.emplace(config_.eventNameMap_.at(TRACE_EVENT_BINDER_TRANSACTION), + std::bind(&CpuDetailParser::BinderTractionEvent, this, std::placeholders::_1)); + eventToFunctionMap_.emplace(config_.eventNameMap_.at(TRACE_EVENT_BINDER_TRANSACTION_RECEIVED), + std::bind(&CpuDetailParser::BinderTractionReceivedEvent, this, std::placeholders::_1)); + eventToFunctionMap_.emplace(config_.eventNameMap_.at(TRACE_EVENT_BINDER_TRANSACTION_ALLOC_BUF), + std::bind(&CpuDetailParser::BinderTractionAllocBufEvent, this, std::placeholders::_1)); +} +void CpuDetailParser::StackEventsInitialization() +{ + eventToFunctionMap_.emplace( + config_.eventNameMap_.at(TRACE_EVENT_PRINT), + std::bind(&CpuDetailParser::ParseTracingMarkWriteOrPrintEvent, this, std::placeholders::_1)); + eventToFunctionMap_.emplace(config_.eventNameMap_.at(TRACE_EVENT_WORKQUEUE_EXECUTE_START), + std::bind(&CpuDetailParser::WorkqueueExecuteStartEvent, this, std::placeholders::_1)); + eventToFunctionMap_.emplace(config_.eventNameMap_.at(TRACE_EVENT_WORKQUEUE_EXECUTE_END), + std::bind(&CpuDetailParser::WorkqueueExecuteEndEvent, this, std::placeholders::_1)); +} +void CpuDetailParser::VoltageEventInitialization() +{ + eventToFunctionMap_.emplace(config_.eventNameMap_.at(TRACE_EVENT_REGULATOR_SET_VOLTAGE), + std::bind(&CpuDetailParser::RegulatorSetVoltageEvent, this, std::placeholders::_1)); + eventToFunctionMap_.emplace( + config_.eventNameMap_.at(TRACE_EVENT_REGULATOR_SET_VOLTAGE_COMPLETE), + std::bind(&CpuDetailParser::RegulatorSetVoltageCompleteEvent, this, std::placeholders::_1)); + eventToFunctionMap_.emplace(config_.eventNameMap_.at(TRACE_EVENT_REGULATOR_DISABLE), + std::bind(&CpuDetailParser::RegulatorDisableEvent, this, std::placeholders::_1)); + eventToFunctionMap_.emplace( + config_.eventNameMap_.at(TRACE_EVENT_REGULATOR_DISABLE_COMPLETE), + std::bind(&CpuDetailParser::RegulatorDisableCompleteEvent, this, std::placeholders::_1)); +} + void CpuDetailParser::EventAppend(std::unique_ptr event) { rawTraceEventList_.emplace_back(std::move(event)); diff --git a/trace_streamer/src/parser/rawtrace_parser/cpu_detail_parser.h b/trace_streamer/src/parser/rawtrace_parser/cpu_detail_parser.h index bb546d18..35ed986b 100644 --- a/trace_streamer/src/parser/rawtrace_parser/cpu_detail_parser.h +++ b/trace_streamer/src/parser/rawtrace_parser/cpu_detail_parser.h @@ -73,6 +73,14 @@ private: bool RegulatorDisableEvent(const RawTraceEventInfo& event) const; bool RegulatorDisableCompleteEvent(const RawTraceEventInfo& event) const; + void InterruptEventInitialization(); + void ClockEventInitialization(); + void CpuEventInitialization(); + void LockEventInitialization(); + void BinderEventInitialization(); + void StackEventsInitialization(); + void VoltageEventInitialization(); + private: using FuncCall = std::function; const TraceStreamerFilters* streamFilters_; diff --git a/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.cpp b/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.cpp index fd424e2e..aca1e11e 100644 --- a/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.cpp +++ b/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.cpp @@ -26,75 +26,12 @@ FtraceEventProcessor& FtraceEventProcessor::GetInstance() FtraceEventProcessor::FtraceEventProcessor() { eventNameToFunctions_ = { - {config_.eventNameMap_.at(TRACE_EVENT_IPI_ENTRY), - std::bind(&FtraceEventProcessor::IpiEntry, this, std::placeholders::_1, std::placeholders::_2, - std::placeholders::_3, std::placeholders::_4)}, - {config_.eventNameMap_.at(TRACE_EVENT_IPI_EXIT), - std::bind(&FtraceEventProcessor::IpiExit, this, std::placeholders::_1, std::placeholders::_2, - std::placeholders::_3, std::placeholders::_4)}, - {config_.eventNameMap_.at(TRACE_EVENT_IRQ_HANDLER_ENTRY), - std::bind(&FtraceEventProcessor::IrqHandlerEntry, this, std::placeholders::_1, std::placeholders::_2, - std::placeholders::_3, std::placeholders::_4)}, - {config_.eventNameMap_.at(TRACE_EVENT_IRQ_HANDLER_EXIT), - std::bind(&FtraceEventProcessor::IrqHandlerExit, this, std::placeholders::_1, std::placeholders::_2, - std::placeholders::_3, std::placeholders::_4)}, - {config_.eventNameMap_.at(TRACE_EVENT_SOFTIRQ_RAISE), - std::bind(&FtraceEventProcessor::SoftirqRaise, this, std::placeholders::_1, std::placeholders::_2, - std::placeholders::_3, std::placeholders::_4)}, - {config_.eventNameMap_.at(TRACE_EVENT_SOFTIRQ_ENTRY), - std::bind(&FtraceEventProcessor::SoftirqEntry, this, std::placeholders::_1, std::placeholders::_2, - std::placeholders::_3, std::placeholders::_4)}, - {config_.eventNameMap_.at(TRACE_EVENT_SOFTIRQ_EXIT), - std::bind(&FtraceEventProcessor::SoftirqExit, this, std::placeholders::_1, std::placeholders::_2, - std::placeholders::_3, std::placeholders::_4)}, - {config_.eventNameMap_.at(TRACE_EVENT_SUSPEND_RESUME), - std::bind(&FtraceEventProcessor::SuspendResume, this, std::placeholders::_1, std::placeholders::_2, - std::placeholders::_3, std::placeholders::_4)}, - {config_.eventNameMap_.at(TRACE_EVENT_WORKQUEUE_EXECUTE_START), - std::bind(&FtraceEventProcessor::WorkqueueExecuteStart, this, std::placeholders::_1, std::placeholders::_2, - std::placeholders::_3, std::placeholders::_4)}, - {config_.eventNameMap_.at(TRACE_EVENT_WORKQUEUE_EXECUTE_END), - std::bind(&FtraceEventProcessor::WorkqueueExecuteEnd, this, std::placeholders::_1, std::placeholders::_2, - std::placeholders::_3, std::placeholders::_4)}, - {config_.eventNameMap_.at(TRACE_EVENT_CPU_IDLE), - std::bind(&FtraceEventProcessor::CpuIdle, this, std::placeholders::_1, std::placeholders::_2, - std::placeholders::_3, std::placeholders::_4)}, - {config_.eventNameMap_.at(TRACE_EVENT_CPU_FREQUENCY), - std::bind(&FtraceEventProcessor::CpuFrequency, this, std::placeholders::_1, std::placeholders::_2, - std::placeholders::_3, std::placeholders::_4)}, - {config_.eventNameMap_.at(TRACE_EVENT_CPU_FREQUENCY_LIMITS), - std::bind(&FtraceEventProcessor::CpuFrequencyLimits, this, std::placeholders::_1, std::placeholders::_2, - std::placeholders::_3, std::placeholders::_4)}, - {config_.eventNameMap_.at(TRACE_EVENT_PRINT), - std::bind(&FtraceEventProcessor::TracingMarkWriteOrPrintFormat, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)}, - {config_.eventNameMap_.at(TRACE_EVENT_TRACING_MARK_WRITE), - std::bind(&FtraceEventProcessor::TracingMarkWriteOrPrintFormat, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)}, {config_.eventNameMap_.at(TRACE_EVENT_TASK_RENAME), std::bind(&FtraceEventProcessor::TaskRename, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)}, {config_.eventNameMap_.at(TRACE_EVENT_TASK_NEWTASK), std::bind(&FtraceEventProcessor::TaskNewtask, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)}, - {config_.eventNameMap_.at(TRACE_EVENT_BINDER_TRANSACTION), - std::bind(&FtraceEventProcessor::BinderTransaction, this, std::placeholders::_1, std::placeholders::_2, - std::placeholders::_3, std::placeholders::_4)}, - {config_.eventNameMap_.at(TRACE_EVENT_BINDER_TRANSACTION_RECEIVED), - std::bind(&FtraceEventProcessor::BinderTransactionReceived, this, std::placeholders::_1, std::placeholders::_2, - std::placeholders::_3, std::placeholders::_4)}, - {config_.eventNameMap_.at(TRACE_EVENT_BINDER_TRANSACTION_ALLOC_BUF), - std::bind(&FtraceEventProcessor::BinderTransactionAllocBuf, this, std::placeholders::_1, std::placeholders::_2, - std::placeholders::_3, std::placeholders::_4)}, - {config_.eventNameMap_.at(TRACE_EVENT_BINDER_TRANSACTION_LOCK), - std::bind(&FtraceEventProcessor::BinderTransactionAllocLock, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)}, - {config_.eventNameMap_.at(TRACE_EVENT_BINDER_TRANSACTION_LOCKED), - std::bind(&FtraceEventProcessor::BinderTransactionAllocLocked, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)}, - {config_.eventNameMap_.at(TRACE_EVENT_BINDER_TRANSACTION_UNLOCK), - std::bind(&FtraceEventProcessor::BinderTransactionAllocUnlock, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)}, {config_.eventNameMap_.at(TRACE_EVENT_SCHED_SWITCH), std::bind(&FtraceEventProcessor::SchedSwitch, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)}, @@ -113,31 +50,141 @@ FtraceEventProcessor::FtraceEventProcessor() {config_.eventNameMap_.at(TRACE_EVENT_PROCESS_EXIT), std::bind(&FtraceEventProcessor::SchedProcessExit, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)}, - {config_.eventNameMap_.at(TRACE_EVENT_PROCESS_FREE), - std::bind(&FtraceEventProcessor::SchedProcessFree, this, std::placeholders::_1, std::placeholders::_2, - std::placeholders::_3, std::placeholders::_4)}, - {config_.eventNameMap_.at(TRACE_EVENT_CLOCK_SET_RATE), - std::bind(&FtraceEventProcessor::ClockSetRate, this, std::placeholders::_1, std::placeholders::_2, - std::placeholders::_3, std::placeholders::_4)}, - {config_.eventNameMap_.at(TRACE_EVENT_CLOCK_ENABLE), - std::bind(&FtraceEventProcessor::ClockEnable, this, std::placeholders::_1, std::placeholders::_2, - std::placeholders::_3, std::placeholders::_4)}, - {config_.eventNameMap_.at(TRACE_EVENT_CLOCK_DISABLE), - std::bind(&FtraceEventProcessor::ClockDisable, this, std::placeholders::_1, std::placeholders::_2, + {config_.eventNameMap_.at(TRACE_EVENT_IPI_ENTRY), + std::bind(&FtraceEventProcessor::IpiEntry, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)}, - {config_.eventNameMap_.at(TRACE_EVENT_REGULATOR_SET_VOLTAGE), - std::bind(&FtraceEventProcessor::RegulatorSetVoltage, this, std::placeholders::_1, std::placeholders::_2, + {config_.eventNameMap_.at(TRACE_EVENT_IPI_EXIT), + std::bind(&FtraceEventProcessor::IpiExit, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)}, - {config_.eventNameMap_.at(TRACE_EVENT_REGULATOR_SET_VOLTAGE_COMPLETE), - std::bind(&FtraceEventProcessor::RegulatorSetVoltageComplete, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)}, - {config_.eventNameMap_.at(TRACE_EVENT_REGULATOR_DISABLE), - std::bind(&FtraceEventProcessor::RegulatorDisable, this, std::placeholders::_1, std::placeholders::_2, + {config_.eventNameMap_.at(TRACE_EVENT_PROCESS_FREE), + std::bind(&FtraceEventProcessor::SchedProcessFree, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)}, - {config_.eventNameMap_.at(TRACE_EVENT_REGULATOR_DISABLE_COMPLETE), - std::bind(&FtraceEventProcessor::RegulatorDisableComplete, this, std::placeholders::_1, std::placeholders::_2, + {config_.eventNameMap_.at(TRACE_EVENT_SUSPEND_RESUME), + std::bind(&FtraceEventProcessor::SuspendResume, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)}, }; + InterruptEventInitialization(); + ClockEventInitialization(); + CpuEventInitialization(); + LockEventInitialization(); + BinderEventInitialization(); + StackEventsInitialization(); + VoltageEventInitialization(); +} + +void FtraceEventProcessor::InterruptEventInitialization() +{ + // In order for the constructor to not exceed 50 lines, it can only be placed here + eventNameToFunctions_.emplace(config_.eventNameMap_.at(TRACE_EVENT_TRACING_MARK_WRITE), + std::bind(&FtraceEventProcessor::TracingMarkWriteOrPrintFormat, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, + std::placeholders::_4)); + + eventNameToFunctions_.emplace(config_.eventNameMap_.at(TRACE_EVENT_IRQ_HANDLER_ENTRY), + std::bind(&FtraceEventProcessor::IrqHandlerEntry, this, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)); + + eventNameToFunctions_.emplace(config_.eventNameMap_.at(TRACE_EVENT_IRQ_HANDLER_EXIT), + std::bind(&FtraceEventProcessor::IrqHandlerExit, this, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)); + eventNameToFunctions_.emplace(config_.eventNameMap_.at(TRACE_EVENT_SOFTIRQ_RAISE), + std::bind(&FtraceEventProcessor::SoftirqRaise, this, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)); + eventNameToFunctions_.emplace(config_.eventNameMap_.at(TRACE_EVENT_SOFTIRQ_ENTRY), + std::bind(&FtraceEventProcessor::SoftirqEntry, this, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)); + + eventNameToFunctions_.emplace(config_.eventNameMap_.at(TRACE_EVENT_SOFTIRQ_EXIT), + std::bind(&FtraceEventProcessor::SoftirqExit, this, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)); +} +void FtraceEventProcessor::ClockEventInitialization() +{ + eventNameToFunctions_.emplace(config_.eventNameMap_.at(TRACE_EVENT_CLOCK_SET_RATE), + std::bind(&FtraceEventProcessor::ClockSetRate, this, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)); + eventNameToFunctions_.emplace(config_.eventNameMap_.at(TRACE_EVENT_CLOCK_ENABLE), + std::bind(&FtraceEventProcessor::ClockEnable, this, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)); + eventNameToFunctions_.emplace(config_.eventNameMap_.at(TRACE_EVENT_CLOCK_DISABLE), + std::bind(&FtraceEventProcessor::ClockDisable, this, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)); +} +void FtraceEventProcessor::CpuEventInitialization() +{ + eventNameToFunctions_.emplace(config_.eventNameMap_.at(TRACE_EVENT_CPU_IDLE), + std::bind(&FtraceEventProcessor::CpuIdle, this, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)); + eventNameToFunctions_.emplace(config_.eventNameMap_.at(TRACE_EVENT_CPU_FREQUENCY), + std::bind(&FtraceEventProcessor::CpuFrequency, this, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)); + eventNameToFunctions_.emplace(config_.eventNameMap_.at(TRACE_EVENT_CPU_FREQUENCY_LIMITS), + std::bind(&FtraceEventProcessor::CpuFrequencyLimits, this, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)); +} +void FtraceEventProcessor::LockEventInitialization() +{ + eventNameToFunctions_.emplace(config_.eventNameMap_.at(TRACE_EVENT_BINDER_TRANSACTION_LOCK), + std::bind(&FtraceEventProcessor::BinderTransactionAllocLock, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, + std::placeholders::_4)); + + eventNameToFunctions_.emplace(config_.eventNameMap_.at(TRACE_EVENT_BINDER_TRANSACTION_LOCKED), + std::bind(&FtraceEventProcessor::BinderTransactionAllocLocked, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, + std::placeholders::_4)); + + eventNameToFunctions_.emplace(config_.eventNameMap_.at(TRACE_EVENT_BINDER_TRANSACTION_UNLOCK), + std::bind(&FtraceEventProcessor::BinderTransactionAllocUnlock, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, + std::placeholders::_4)); +} +void FtraceEventProcessor::BinderEventInitialization() +{ + eventNameToFunctions_.emplace(config_.eventNameMap_.at(TRACE_EVENT_BINDER_TRANSACTION), + std::bind(&FtraceEventProcessor::BinderTransaction, this, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)); + eventNameToFunctions_.emplace(config_.eventNameMap_.at(TRACE_EVENT_BINDER_TRANSACTION_RECEIVED), + std::bind(&FtraceEventProcessor::BinderTransactionReceived, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, + std::placeholders::_4)); + + eventNameToFunctions_.emplace(config_.eventNameMap_.at(TRACE_EVENT_BINDER_TRANSACTION_ALLOC_BUF), + std::bind(&FtraceEventProcessor::BinderTransactionAllocBuf, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, + std::placeholders::_4)); +} +void FtraceEventProcessor::StackEventsInitialization() +{ + eventNameToFunctions_.emplace(config_.eventNameMap_.at(TRACE_EVENT_PRINT), + std::bind(&FtraceEventProcessor::TracingMarkWriteOrPrintFormat, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, + std::placeholders::_4)); + eventNameToFunctions_.emplace(config_.eventNameMap_.at(TRACE_EVENT_WORKQUEUE_EXECUTE_START), + std::bind(&FtraceEventProcessor::WorkqueueExecuteStart, this, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)); + eventNameToFunctions_.emplace(config_.eventNameMap_.at(TRACE_EVENT_WORKQUEUE_EXECUTE_END), + std::bind(&FtraceEventProcessor::WorkqueueExecuteEnd, this, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)); +} +void FtraceEventProcessor::VoltageEventInitialization() +{ + eventNameToFunctions_.emplace(config_.eventNameMap_.at(TRACE_EVENT_REGULATOR_SET_VOLTAGE), + std::bind(&FtraceEventProcessor::RegulatorSetVoltage, this, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)); + + eventNameToFunctions_.emplace(config_.eventNameMap_.at(TRACE_EVENT_REGULATOR_SET_VOLTAGE_COMPLETE), + std::bind(&FtraceEventProcessor::RegulatorSetVoltageComplete, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, + std::placeholders::_4)); + eventNameToFunctions_.emplace(config_.eventNameMap_.at(TRACE_EVENT_REGULATOR_DISABLE), + std::bind(&FtraceEventProcessor::RegulatorDisable, this, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3, std::placeholders::_4)); + + eventNameToFunctions_.emplace(config_.eventNameMap_.at(TRACE_EVENT_REGULATOR_DISABLE_COMPLETE), + std::bind(&FtraceEventProcessor::RegulatorDisableComplete, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, + std::placeholders::_4)); } FtraceEventProcessor::~FtraceEventProcessor() diff --git a/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.h b/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.h index d612346f..af13ac8d 100644 --- a/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.h +++ b/trace_streamer/src/parser/rawtrace_parser/ftrace_event_processor.h @@ -76,6 +76,14 @@ private: bool RegulatorDisable(FtraceEvent& ftraceEvent, uint8_t data[], size_t size, const EventFormat& format); bool RegulatorDisableComplete(FtraceEvent& ftraceEvent, uint8_t data[], size_t size, const EventFormat& format); + void InterruptEventInitialization(); + void ClockEventInitialization(); + void CpuEventInitialization(); + void LockEventInitialization(); + void BinderEventInitialization(); + void StackEventsInitialization(); + void VoltageEventInitialization(); + private: FtraceEventProcessor(); ~FtraceEventProcessor(); diff --git a/trace_streamer/src/rpc/ffrt_converter.cpp b/trace_streamer/src/rpc/ffrt_converter.cpp index 48e3438d..2cbc4921 100644 --- a/trace_streamer/src/rpc/ffrt_converter.cpp +++ b/trace_streamer/src/rpc/ffrt_converter.cpp @@ -31,7 +31,6 @@ bool FfrtConverter::RecoverTraceAndGenerateNewFile(const std::string& ffrtFileNa CheckTraceMarker(lines); TypeFfrtPid result = ClassifyLogsForFfrtWorker(lines); ConvertFfrtThreadToFfrtTask(lines, result); - SupplementFfrtBlockAndWakeInfo(lines); for (const std::string& lineergodic : lines) { outFile << lineergodic << std::endl; } @@ -133,11 +132,6 @@ std::string FfrtConverter::MakeEndFakeLog(const std::string& mark, threadName.c_str(), tid, prio); std::string fakeLog = result.get(); memset_s(result.get(), MAX_LEN, 0, MAX_LEN); - if (mark.find("|B|") != std::string::npos || mark.find("|H:B ") != std::string::npos) { - (void)sprintf_s(result.get(), MAX_LEN, " %s-%s (%7d) [%s] .... %s: %sE|%d\n", label.c_str(), - taskId.c_str(), pid, cpuId.c_str(), endTimeStamp.c_str(), tracingMarkerKey_.c_str(), pid); - fakeLog = result.get() + fakeLog; - } return fakeLog; } @@ -375,262 +369,168 @@ FfrtConverter::TypeFfrtPid FfrtConverter::ClassifyLogsForFfrtWorker(vector& results, FfrtConverter::TypeFfrtPid& ffrtPidsMap) +void FfrtConverter::UpdatePrio(int& prio, const std::string& mark, const int tid) { - int prio; - std::unordered_map> taskLabels; - for (auto& [pid, tids] : ffrtPidsMap) { - taskLabels[pid] = {}; - for (auto& [tid, info] : ffrtPidsMap[pid]) { - auto& threadName = info.name; - auto switchInFakeLog = false; - auto switchOutFakeLog = false; - auto ffbkMarkRemove = false; - auto gid = WAKE_EVENT_DEFAULT_VALUE; - for (auto& line : info.line) { - auto mark = results[line]; - if (mark.find("sched_switch:") != std::string::npos) { - if (mark.find("prev_pid=" + std::to_string(tid) + " ") != std::string::npos) { - static std::string beginPprio = "prev_prio="; - auto beginPos = mark.find(beginPprio); - beginPos = beginPos + beginPprio.length(); - auto endPos = mark.find_first_of(" ", beginPos); - prio = stoi(mark.substr(beginPos, endPos - beginPos)); - } else if (mark.find("next_pid=" + std::to_string(tid)) != std::string::npos) { - static std::string beginNprio = "next_prio="; - auto beginPos = mark.find(beginNprio); - beginPos = beginPos + beginNprio.length(); - prio = stoi(mark.substr(beginPos)); - } - } - if (mark.find("FFRT::[") != std::string::npos) { - std::string missLog; - auto beginPos = mark.rfind("["); - auto endPos = mark.rfind("]"); - auto label = mark.substr(beginPos + 1, endPos - beginPos - 1); - if (gid != WAKE_EVENT_DEFAULT_VALUE) { - missLog = MakeEndFakeLog(mark, pid, taskLabels[pid][gid], gid, tid, threadName, prio); - auto timestamp = ExtractTimeStr(mark); - auto cpuId = ExtractCpuId(mark); - std::unique_ptr result = std::make_unique(MAX_LEN); - (void)sprintf_s(result.get(), MAX_LEN, " %s-%d (%7d) [%s] .... %s: %sE|%d\n", - threadName.c_str(), tid, pid, cpuId.c_str(), timestamp.c_str(), - tracingMarkerKey_.c_str(), pid); - missLog = missLog + result.get(); - memset_s(result.get(), MAX_LEN, 0, MAX_LEN); - } - beginPos = mark.rfind("|"); - if (beginPos != std::string::npos && IsDigit(mark.substr(beginPos + 1))) { - gid = stoll(mark.substr(beginPos + 1)); - } else { - continue; - } - if (taskLabels[pid].find(gid) == taskLabels[pid].end()) { - taskLabels[pid][gid] = label; - } - results[line] = MakeBeginFakeLog(mark, pid, taskLabels[pid][gid], gid, tid, threadName, prio); - if (!missLog.empty()) { - results[line] = missLog + results[line]; - } - switchInFakeLog = true; - continue; - } - if (gid != WAKE_EVENT_DEFAULT_VALUE) { - static const std::regex CoPattern = std::regex(R"( F\|(\d+)\|Co\|(\d+))"); - static const std::regex HCoPattern = std::regex(R"( F\|(\d+)\|H:Co\s(\d+))"); - if (std::regex_search(mark, CoPattern) || std::regex_search(mark, HCoPattern)) { - results[line].clear(); - if (switchInFakeLog) { - switchInFakeLog = false; - continue; - } else { - switchOutFakeLog = true; - continue; - } - } - if (switchInFakeLog && (mark.find(tracingMarkerKey_ + "B") != std::string::npos)) { - results[line].clear(); - continue; - } - if (switchOutFakeLog && (mark.find(tracingMarkerKey_ + "E") != std::string::npos)) { - results[line].clear(); - continue; - } - static const std::regex EndPattern = std::regex(R"( F\|(\d+)\|[BF]\|(\d+))"); - static const std::regex HEndPattern = std::regex(R"( F\|(\d+)\|H:[BF]\s(\d+))"); - if (std::regex_search(mark, EndPattern) || std::regex_search(mark, HEndPattern)) { - results[line] = MakeEndFakeLog(mark, pid, taskLabels[pid][gid], gid, tid, threadName, prio); - gid = WAKE_EVENT_DEFAULT_VALUE; - switchOutFakeLog = false; - continue; - } - auto fakeLog = ConvertWorkerLogToTask(mark, pid, taskLabels[pid][gid], gid, tid); - const std::string chdStr = "[chd]"; - const std::string datStr = "[dat]"; - const std::string fdStr = "[fd]"; - const std::string mtxStr = "[mtx]"; - const std::string slpStr = "[slp]"; - const std::string yldStr = "[yld]"; - const std::string cndStr = "[cnd]"; - const std::string cntStr = "[cnt]"; - if (fakeLog.find("FFBK[") != std::string::npos) { - if (fakeLog.find("[dep]") != std::string::npos) { - fakeLog = ""; - } else if (fakeLog.find(chdStr) != std::string::npos) { - auto beginPos = fakeLog.find(chdStr); - fakeLog = fakeLog.replace(beginPos, chdStr.length(), "[wait_child]"); - } else if (fakeLog.find(datStr) != std::string::npos) { - auto beginPos = fakeLog.find(datStr); - fakeLog = fakeLog.replace(beginPos, datStr.length(), "[wait_data]"); - } else if (fakeLog.find(fdStr) != std::string::npos) { - auto beginPos = fakeLog.find(fdStr); - fakeLog = fakeLog.replace(beginPos, fdStr.length(), "[wait_fd]"); - } else if (fakeLog.find(mtxStr) != std::string::npos) { - auto beginPos = fakeLog.find(mtxStr); - fakeLog = fakeLog.replace(beginPos, mtxStr.length(), "[mutex]"); - } else if (fakeLog.find(slpStr) != std::string::npos) { - auto beginPos = fakeLog.find(slpStr); - fakeLog = fakeLog.replace(beginPos, slpStr.length(), "[sleep]"); - } else if (fakeLog.find(yldStr) != std::string::npos) { - auto beginPos = fakeLog.find(yldStr); - fakeLog = fakeLog.replace(beginPos, yldStr.length(), "[yield]"); - } else if (fakeLog.find(cndStr) != std::string::npos) { - auto beginPos = fakeLog.find(cndStr); - fakeLog = fakeLog.replace(beginPos, cndStr.length(), "[cond_wait]"); - } else if (fakeLog.find(cntStr) != std::string::npos) { - auto beginPos = fakeLog.find(cntStr); - fakeLog = fakeLog.replace(beginPos, cntStr.length(), "[cond_timedwait]"); - } - ffbkMarkRemove = true; - } - if (ffbkMarkRemove && mark.find(tracingMarkerKey_ + "E") != std::string::npos) { - results[line].clear(); - ffbkMarkRemove = false; - continue; - } - results[line] = fakeLog; - continue; - } - } + if (mark.find("sched_switch:") == std::string::npos) { + return; + } + if (mark.find("prev_pid=" + std::to_string(tid) + " ") != std::string::npos) { + static std::string beginPprio = "prev_prio="; + auto beginPos = mark.find(beginPprio); + beginPos = beginPos + beginPprio.length(); + auto endPos = mark.find_first_of(" ", beginPos); + prio = stoi(mark.substr(beginPos, endPos - beginPos)); + } else if (mark.find("next_pid=" + std::to_string(tid)) != std::string::npos) { + static std::string beginNprio = "next_prio="; + auto beginPos = mark.find(beginNprio); + beginPos = beginPos + beginNprio.length(); + prio = stoi(mark.substr(beginPos)); + } +} +std::string FfrtConverter::GetLabel(const string& mark) +{ + std::string label; + if (mark.find("|H:FFRT") != std::string::npos) { + if (mark.find("H:FFRT::") != std::string::npos) { + auto beginPos = mark.rfind("["); + auto endPos = mark.rfind("]"); + auto label = mark.substr(beginPos + 1, endPos - beginPos - 1); + } else { + static std::string indexHFfrt = "|H:FFRT"; + auto beginPos = mark.find(indexHFfrt); + beginPos = beginPos + indexHFfrt.length(); + auto endPos = mark.find_first_of("|", beginPos); + label = mark.substr(beginPos, endPos - beginPos); + } + } else { + if (mark.find("|FFRT::") != std::string::npos) { + auto beginPos = mark.rfind("["); + auto endPos = mark.rfind("]"); + auto label = mark.substr(beginPos + 1, endPos - beginPos - 1); + } else { + static std::string indexFfrt = "|FFRT"; + auto beginPos = mark.find(indexFfrt); + beginPos = beginPos + indexFfrt.length(); + auto endPos = mark.find_first_of("|", beginPos); + label = mark.substr(beginPos, endPos - beginPos); } } - return; + return label; } -void FfrtConverter::SupplementFfrtBlockAndWakeInfo(vector& results) +std::string FfrtConverter::getNewMissLog(std::string& missLog, + const std::string& mark, + const int pid, + const int tid, + std::string threadName) { - std::unordered_map> taskWak; - std::string readyEndLog; + auto timestamp = ExtractTimeStr(mark); + auto cpuId = ExtractCpuId(mark); std::unique_ptr result = std::make_unique(MAX_LEN); - for (int line = 0; line < results.size(); line++) { - auto log = results[line]; - int32_t pid; - size_t beginPos; - long long gid; - size_t endPos; - if (log.find("FFBK[") != std::string::npos) { - pid = ExtractProcessId(log); - beginPos = log.rfind("|"); - gid = stoll(log.substr(beginPos + 1)); - if (taskWak.find(pid) == taskWak.end()) { - taskWak[pid] = {}; - } - if (taskWak[pid].find(gid) == taskWak[pid].end()) { - taskWak[pid][gid] = {}; - } - readyEndLog = ""; - if (taskWak[pid][gid].state == "ready") { - auto timestamp = ExtractTimeStr(log); - auto cpuId = ExtractCpuId(log); - auto taskId = GetTaskId(pid, gid); - (void)sprintf_s(result.get(), MAX_LEN, " <...>-%s (%7d) [%s] .... %s: %sE|%d\n", taskId.c_str(), - pid, cpuId.c_str(), timestamp.c_str(), tracingMarkerKey_.c_str(), pid); - readyEndLog = result.get(); - memset_s(result.get(), MAX_LEN, 0, MAX_LEN); - } - taskWak[pid][gid].state = "block"; - endPos = results[line].rfind('|'); - results[line] = results[line].substr(0, endPos); - if (!readyEndLog.empty()) { - results[line] = readyEndLog + results[line]; - } - } else if (log.find("FFWK|") != std::string::npos) { - pid = ExtractProcessId(log); - beginPos = log.rfind('|'); - gid = stoll(log.substr(beginPos + 1)); - if (taskWak.find(pid) != taskWak.end() && taskWak[pid].find(gid) != taskWak[pid].end()) { - auto timestamp = ExtractTimeStr(log); - auto cpuId = ExtractCpuId(log); - std::string readyBeginLog; - auto taskId = GetTaskId(pid, gid); - if (log.find("H:FFWK") != std::string::npos) { - (void)sprintf_s(result.get(), MAX_LEN, " <...>-%s (%7d) [%s] .... %s: %sB|%d|H:FFREADY\n", - taskId.c_str(), pid, cpuId.c_str(), timestamp.c_str(), tracingMarkerKey_.c_str(), - pid); + (void)sprintf_s(result.get(), MAX_LEN, " %s-%d (%7d) [%s] .... %s: %sE|%d\n", threadName.c_str(), tid, pid, + cpuId.c_str(), timestamp.c_str(), tracingMarkerKey_.c_str(), pid); + missLog = missLog + result.get(); + memset_s(result.get(), MAX_LEN, 0, MAX_LEN); + return missLog; +} - readyBeginLog = result.get(); - memset_s(result.get(), MAX_LEN, 0, MAX_LEN); - } else { - (void)sprintf_s(result.get(), MAX_LEN, " <...>-%s (%7d) [%s] .... %s: %sB|%d|FFREADY\n", - taskId.c_str(), pid, cpuId.c_str(), timestamp.c_str(), tracingMarkerKey_.c_str(), - pid); - readyBeginLog = result.get(); - memset_s(result.get(), MAX_LEN, 0, MAX_LEN); - } - results[line] = readyBeginLog + results[line]; - if (taskWak[pid][gid].state == "ready") { - results[taskWak[pid][gid].prevWakLine] = results[taskWak[pid][gid].prevWakLine].substr( - results[taskWak[pid][gid].prevWakLine].find("FFREADY") + STR_LEN); - } - taskWak[pid][gid].state = "ready"; - taskWak[pid][gid].prevWakLine = line; - taskWak[pid][gid].prevWakeLog = log; +void FfrtConverter::DeleteRedundance(const std::string& mark, + std::string& log, + bool switchInFakeLog, + bool switchOutFakeLog, + const int pid, + const std::string& label, + long long gid, + const int tid, + const std::string& threadName, + const int prio) +{ + static const std::regex CoPattern = std::regex(R"( F\|(\d+)\|Co\|(\d+))"); + static const std::regex HCoPattern = std::regex(R"( F\|(\d+)\|H:Co\s(\d+))"); + if (std::regex_search(mark, CoPattern) || std::regex_search(mark, HCoPattern)) { + log.clear(); + if (switchInFakeLog) { + switchInFakeLog = false; + return; + } else { + switchOutFakeLog = true; + return; + } + } + if (switchInFakeLog && (mark.find(tracingMarkerKey_ + "B") != std::string::npos)) { + log.clear(); + return; + } + if (switchOutFakeLog && (mark.find(tracingMarkerKey_ + "E") != std::string::npos)) { + log.clear(); + return; + } + static const std::regex EndPattern = std::regex(R"( F\|(\d+)\|[BF]\|(\d+))"); + static const std::regex HEndPattern = std::regex(R"( F\|(\d+)\|H:[BF]\s(\d+))"); + if (std::regex_search(mark, EndPattern) || std::regex_search(mark, HEndPattern)) { + log = MakeEndFakeLog(mark, pid, label, gid, tid, threadName, prio); + gid = WAKE_EVENT_DEFAULT_VALUE; + switchOutFakeLog = false; + return; + } + auto fakeLog = ConvertWorkerLogToTask(mark, pid, label, gid, tid); + log = fakeLog; + return; +} +void FfrtConverter::ConvertFfrtThreadToFfrtTaskByLine( + int pid, + int tid, + int& prio, + std::vector& results, + ffrtContent& content, + std::unordered_map>& taskLabels) +{ + auto& threadName = content.name; + auto switchInFakeLog = false; + auto switchOutFakeLog = false; + auto gid = WAKE_EVENT_DEFAULT_VALUE; + for (auto& line : content.line) { + auto mark = results[line]; + UpdatePrio(prio, mark, tid); + if (mark.find("FFRT::[") != std::string::npos) { + std::string missLog; + auto label = GetLabel(mark); + if (label.find("executor_task") != std::string::npos || label.find("ex_task") != std::string::npos) { + continue; + } + if (gid != WAKE_EVENT_DEFAULT_VALUE) { + missLog = MakeEndFakeLog(mark, pid, taskLabels[pid][gid], gid, tid, threadName, prio); + missLog = getNewMissLog(missLog, mark, pid, tid, threadName); } - } else if (log.find("FFRT::[") != std::string::npos) { - pid = ExtractProcessId(log); - beginPos = log.rfind('|'); - endPos = log.find_first_of('\n', beginPos + 1); - if (beginPos != std::string::npos && endPos != std::string::npos && - IsDigit(log.substr(beginPos + 1, endPos - beginPos - 1))) { - gid = stoll(log.substr(beginPos + 1, endPos - beginPos - 1)); + auto beginPos = mark.rfind("|"); + if (beginPos != std::string::npos && IsDigit(mark.substr(beginPos + 1))) { + gid = stoll(mark.substr(beginPos + 1)); } else { continue; } - if (taskWak.find(pid) != taskWak.end() && taskWak[pid].find(gid) != taskWak[pid].end()) { - if (taskWak[pid][gid].state == "ready") { - auto timestamp = ExtractTimeStr(log); - auto cpuId = ExtractCpuId(log); - endPos = log.rfind('\n'); - beginPos = log.find_last_of('\n', endPos - 1); - auto switchLog = log.substr(beginPos + 1, endPos); - beginPos = switchLog.find("next_comm="); - endPos = switchLog.find("next_pid"); - auto taskComm = switchLog.substr(beginPos + 10, endPos - beginPos - 11); - beginPos = switchLog.find("next_pid="); - endPos = switchLog.find(" next_prio="); - auto taskPid = stoll(switchLog.substr(beginPos + 9, endPos - beginPos - 9)); - auto taskPrio = stoi(switchLog.substr(endPos + 11)); - auto cpuIdWake = ExtractCpuId(switchLog); - beginPos = taskWak[pid][gid].prevWakeLog.find(tracingMarkerKey_); - (void)sprintf_s(result.get(), MAX_LEN, "sched_waking: comm=%s pid=%lld prio=%d target_cpu=%s\n", - taskComm.c_str(), taskPid, taskPrio, cpuIdWake.c_str()); - auto wakingLog = taskWak[pid][gid].prevWakeLog.substr(0, beginPos) + result.get(); - memset_s(result.get(), MAX_LEN, 0, MAX_LEN); - (void)sprintf_s(result.get(), MAX_LEN, "sched_wakeup: comm=%s pid=%lld prio=%d target_cpu=%s", - taskComm.c_str(), taskPid, taskPrio, cpuIdWake.c_str()); - auto wakeupLog = taskWak[pid][gid].prevWakeLog.substr(0, beginPos) + result.get(); - memset_s(result.get(), MAX_LEN, 0, MAX_LEN); - auto taskId = GetTaskId(pid, gid); - results[taskWak[pid][gid].prevWakLine] = - results[taskWak[pid][gid].prevWakLine] + "\n" + wakingLog + wakeupLog; - (void)sprintf_s(result.get(), MAX_LEN, " <...>-%s (%7d) [%s] .... %s: %sE|%d\n", - taskId.c_str(), pid, cpuId.c_str(), timestamp.c_str(), tracingMarkerKey_.c_str(), - pid); - readyEndLog = result.get(); - memset_s(result.get(), MAX_LEN, 0, MAX_LEN); - results[line] = readyEndLog + results[line]; - taskWak[pid][gid].state = "none"; - } + if (taskLabels[pid].find(gid) == taskLabels[pid].end()) { + taskLabels[pid][gid] = label; } + results[line] = MakeBeginFakeLog(mark, pid, taskLabels[pid][gid], gid, tid, threadName, prio); + if (!missLog.empty()) { + results[line] = missLog + results[line]; + } + switchInFakeLog = true; + continue; + } + if (gid != WAKE_EVENT_DEFAULT_VALUE) { + DeleteRedundance(mark, results[line], switchInFakeLog, switchOutFakeLog, pid, taskLabels[pid][gid], gid, + tid, threadName, prio); + } + } +} +void FfrtConverter::ConvertFfrtThreadToFfrtTask(vector& results, FfrtConverter::TypeFfrtPid& ffrtPidsMap) +{ + int prio; + std::unordered_map> taskLabels; + for (auto& [pid, tids] : ffrtPidsMap) { + taskLabels[pid] = {}; + for (auto& [tid, info] : ffrtPidsMap[pid]) { + ConvertFfrtThreadToFfrtTaskByLine(pid, tid, prio, results, info, taskLabels); } } return; diff --git a/trace_streamer/src/rpc/ffrt_converter.h b/trace_streamer/src/rpc/ffrt_converter.h index 2e219ba8..dc431a30 100644 --- a/trace_streamer/src/rpc/ffrt_converter.h +++ b/trace_streamer/src/rpc/ffrt_converter.h @@ -65,6 +65,12 @@ private: std::unordered_map>& traceMap, FfrtConverter::TypeFfrtPid& ffrtPidsMap); int FindTid(string& log); + void ConvertFfrtThreadToFfrtTaskByLine(int pid, + int tid, + int& prio, + std::vector& results, + ffrtContent& content, + std::unordered_map>& taskLabels); void ConvertFfrtThreadToFfrtTask(vector& results, TypeFfrtPid& ffrtPidsMap); std::string MakeBeginFakeLog(const std::string& mark, const int pid, @@ -97,10 +103,26 @@ private: const std::string& label, const long long gid, const int tid); - void SupplementFfrtBlockAndWakeInfo(vector& results); std::string GetTaskId(int pid, long long gid); bool IsDigit(const std::string& str); void CheckTraceMarker(vector& lines); + void UpdatePrio(int& prio, const std::string& mark, const int tid); + std::string GetLabel(const std::string& mark); + void DeleteRedundance(const std::string& mark, + std::string& log, + bool switchInFakeLog, + bool switchOutFakeLog, + const int pid, + const std::string& label, + long long gid, + const int tid, + const std::string& threadName, + const int prio); + std::string getNewMissLog(std::string& missLog, + const std::string& mark, + const int pid, + const int tid, + std::string threadName); private: const std::regex indexPattern_ = std::regex(R"(\(.+\)\s+\[\d)"); diff --git a/trace_streamer/src/rpc/rpc_server.cpp b/trace_streamer/src/rpc/rpc_server.cpp index f3f7717b..6ef90139 100644 --- a/trace_streamer/src/rpc/rpc_server.cpp +++ b/trace_streamer/src/rpc/rpc_server.cpp @@ -300,8 +300,10 @@ bool RpcServer::ParseSplitFileData(const uint8_t* data, TS_LOGE("ParserData failed!"); return false; } - if (isSplitFile && isFinish && - (ts_->GetFileType() == TRACE_FILETYPE_BY_TRACE || ts_->GetFileType() == TRACE_FILETYPE_HILOG || + if (!isSplitFile || !isFinish) { + return false; + } + if ((ts_->GetFileType() == TRACE_FILETYPE_BY_TRACE || ts_->GetFileType() == TRACE_FILETYPE_HILOG || ts_->GetFileType() == TRACE_FILETYPE_HI_SYSEVENT)) { SendBytraceSplitFileData(splitFileCallBack, 0); splitFileCallBack(EMPTY_VALUE, (int32_t)SplitDataDataType::SPLIT_FILE_JSON, 1); @@ -309,55 +311,57 @@ bool RpcServer::ParseSplitFileData(const uint8_t* data, ts_->GetTraceDataCache()->isSplitFile_ = false; return true; } - if (isSplitFile && isFinish && ts_->GetFileType() == TRACE_FILETYPE_H_TRACE) { - uint64_t dataSize = 0; - std::string result = VALUE; - ts_->GetHtraceData()->ClearNativehookData(); - for (const auto& itemHtrace : ts_->GetHtraceData()->GetTraceDataHtrace()) { - dataSize += itemHtrace.second; - result += OFFSET + std::to_string(itemHtrace.first); - result += SIZE + std::to_string(itemHtrace.second); - result += "},"; - } - auto dataSourceType = ts_->GetHtraceData()->GetDataSourceType(); - auto profilerHeader = ts_->GetHtraceData()->GetProfilerHeader(); - if (dataSourceType == DATA_SOURCE_TYPE_JSMEMORY) { - dataSize += ts_->GetHtraceData()->GetArkTsConfigData().size() + - ts_->GetHtraceData()->GetJsMemoryData()->GetArkTsSize(); - } - for (auto& commProto : ts_->GetTraceDataCache()->HookCommProtos()) { - dataSize += (sizeof(uint32_t) + commProto->size()); - } - // Send Header - profilerHeader.data.length = PACKET_HEADER_LENGTH + dataSize; - std::string buffer(reinterpret_cast(&profilerHeader), sizeof(profilerHeader)); - splitFileCallBack(buffer, (int32_t)SplitDataDataType::SPLIT_FILE_DATA, 0); - // Send Datas - ProcHookCommSplitResult(splitFileCallBack); - if (result != VALUE && !ts_->GetHtraceData()->GetTraceDataHtrace().empty()) { - result.pop_back(); - result += "]}\r\n"; - splitFileCallBack(result, (int32_t)SplitDataDataType::SPLIT_FILE_JSON, 0); - } - if (dataSourceType == DATA_SOURCE_TYPE_JSMEMORY) { - splitFileCallBack(ts_->GetHtraceData()->GetArkTsConfigData() + - ts_->GetHtraceData()->GetJsMemoryData()->GetArkTsSplitFileData(), - (int32_t)SplitDataDataType::SPLIT_FILE_DATA, 0); - } - ProcPerfSplitResult(splitFileCallBack, true); - ProcEbpfSplitResult(splitFileCallBack, true); + if (ts_->GetFileType() == TRACE_FILETYPE_H_TRACE) { + ProcHtraceSplitResult(splitFileCallBack); } - if (isSplitFile && isFinish && ts_->GetFileType() == TRACE_FILETYPE_PERF) { + if (ts_->GetFileType() == TRACE_FILETYPE_PERF) { ProcPerfSplitResult(splitFileCallBack, true); } - if (isSplitFile && isFinish) { - splitFileCallBack(EMPTY_VALUE, (int32_t)SplitDataDataType::SPLIT_FILE_JSON, 1); - ts_->GetHtraceData()->ClearTraceDataHtrace(); - ts_->GetHtraceData()->GetJsMemoryData()->ClearArkTsSplitFileData(); - ts_->GetTraceDataCache()->isSplitFile_ = false; - } + splitFileCallBack(EMPTY_VALUE, (int32_t)SplitDataDataType::SPLIT_FILE_JSON, 1); + ts_->GetHtraceData()->ClearTraceDataHtrace(); + ts_->GetHtraceData()->GetJsMemoryData()->ClearArkTsSplitFileData(); + ts_->GetTraceDataCache()->isSplitFile_ = false; return true; } +void RpcServer::ProcHtraceSplitResult(SplitFileCallBack splitFileCallBack) +{ + uint64_t dataSize = 0; + std::string result = VALUE; + ts_->GetHtraceData()->ClearNativehookData(); + for (const auto& itemHtrace : ts_->GetHtraceData()->GetTraceDataHtrace()) { + dataSize += itemHtrace.second; + result += OFFSET + std::to_string(itemHtrace.first); + result += SIZE + std::to_string(itemHtrace.second); + result += "},"; + } + auto dataSourceType = ts_->GetHtraceData()->GetDataSourceType(); + auto profilerHeader = ts_->GetHtraceData()->GetProfilerHeader(); + if (dataSourceType == DATA_SOURCE_TYPE_JSMEMORY) { + dataSize += + ts_->GetHtraceData()->GetArkTsConfigData().size() + ts_->GetHtraceData()->GetJsMemoryData()->GetArkTsSize(); + } + for (auto& commProto : ts_->GetTraceDataCache()->HookCommProtos()) { + dataSize += (sizeof(uint32_t) + commProto->size()); + } + // Send Header + profilerHeader.data.length = PACKET_HEADER_LENGTH + dataSize; + std::string buffer(reinterpret_cast(&profilerHeader), sizeof(profilerHeader)); + splitFileCallBack(buffer, (int32_t)SplitDataDataType::SPLIT_FILE_DATA, 0); + // Send Datas + ProcHookCommSplitResult(splitFileCallBack); + if (result != VALUE && !ts_->GetHtraceData()->GetTraceDataHtrace().empty()) { + result.pop_back(); + result += "]}\r\n"; + splitFileCallBack(result, (int32_t)SplitDataDataType::SPLIT_FILE_JSON, 0); + } + if (dataSourceType == DATA_SOURCE_TYPE_JSMEMORY) { + splitFileCallBack(ts_->GetHtraceData()->GetArkTsConfigData() + + ts_->GetHtraceData()->GetJsMemoryData()->GetArkTsSplitFileData(), + (int32_t)SplitDataDataType::SPLIT_FILE_DATA, 0); + } + ProcPerfSplitResult(splitFileCallBack, true); + ProcEbpfSplitResult(splitFileCallBack, true); +} void RpcServer::ProcHookCommSplitResult(SplitFileCallBack splitFileCallBack) { std::string lenBuffer(sizeof(uint32_t), 0); @@ -580,19 +584,8 @@ int32_t RpcServer::WasmExportDatabase(ResultCallBack resultCallBack) } #if IS_WASM -int32_t RpcServer::DownloadELFCallback(const std::string& fileName, - size_t totalLen, - const uint8_t* data, - size_t len, - int32_t finish, - ParseELFFileCallBack parseELFFile) +void RpcServer::CreateFilePath(const std::string& filePath) { - g_fileLen += len; - std::string filePath = ""; - TS_LOGI("fileName = %s", fileName.c_str()); - std::string symbolsPath = fileName.substr(0, fileName.find("/")); - TS_LOGI("symbolsPath = %s", symbolsPath.c_str()); - filePath = fileName.substr(0, fileName.find_last_of("/")); if (std::filesystem::exists(filePath)) { TS_LOGE("%s exist", filePath.c_str()); } else { @@ -603,23 +596,10 @@ int32_t RpcServer::DownloadELFCallback(const std::string& fileName, } } TS_LOGI("filePath = %s", filePath.c_str()); - if (g_fileLen < totalLen) { - if (g_importFileFd == nullptr) { - g_importFileFd = fopen(fileName.c_str(), "a+"); - if (g_importFileFd == nullptr) { - TS_LOGE("wasm file create failed"); - return false; - } - } - int32_t writeLength = fwrite(data, len, 1, g_importFileFd); - if (!writeLength) { - fclose(g_importFileFd); - TS_LOGE("wasm write file failed"); - return false; - } - return false; - } - g_fileLen = 0; +} + +bool RpcServer::WriteToFile(const std::string& fileName, const uint8_t* data, size_t len) +{ if (g_importFileFd == nullptr) { g_importFileFd = fopen(fileName.c_str(), "a+"); if (g_importFileFd == nullptr) { @@ -628,16 +608,16 @@ int32_t RpcServer::DownloadELFCallback(const std::string& fileName, } } int32_t writeLength = fwrite(data, len, 1, g_importFileFd); - (void)fclose(g_importFileFd); - g_importFileFd = nullptr; if (!writeLength) { + fclose(g_importFileFd); TS_LOGE("wasm write file failed"); return false; } - TS_LOGI("symbolsPath = %s, fileName = %s", symbolsPath.c_str(), fileName.c_str()); - symbolsPathFiles_.emplace_back(fileName); - parseELFFile("file send over\r\n", SEND_FINISH); + return false; +} +bool RpcServer::ClearPathFile(string& symbolsPath, int32_t finish, ParseELFFileCallBack& parseELFFile) +{ if (finish) { if (!ts_->ReloadSymbolFiles(symbolsPath, symbolsPathFiles_)) { symbolsPathFiles_.clear(); @@ -654,6 +634,49 @@ int32_t RpcServer::DownloadELFCallback(const std::string& fileName, } return true; } + +bool RpcServer::DownloadELFCallback(const std::string& fileName, + size_t totalLen, + const uint8_t* data, + size_t len, + int32_t finish, + ParseELFFileCallBack parseELFFile) +{ + g_fileLen += len; + std::string filePath = ""; + TS_LOGI("fileName = %s", fileName.c_str()); + std::string symbolsPath = fileName.substr(0, fileName.find("/")); + TS_LOGI("symbolsPath = %s", symbolsPath.c_str()); + filePath = fileName.substr(0, fileName.find_last_of("/")); + CreateFilePath(filePath); + if (g_fileLen < totalLen) { + return WriteToFile(fileName, data, len); + } + g_fileLen = 0; + if (g_importFileFd == nullptr) { + g_importFileFd = fopen(fileName.c_str(), "a+"); + if (g_importFileFd == nullptr) { + TS_LOGE("wasm file create failed"); + return false; + } + } + int32_t writeLength = fwrite(data, len, 1, g_importFileFd); + (void)fclose(g_importFileFd); + g_importFileFd = nullptr; + if (!writeLength) { + TS_LOGE("wasm write file failed"); + return false; + } + TS_LOGI("symbolsPath = %s, fileName = %s", symbolsPath.c_str(), fileName.c_str()); + symbolsPathFiles_.emplace_back(fileName); + parseELFFile("file send over\r\n", SEND_FINISH); + // When the transfer is completed, reload the symbol file, clear the symbol path file list, call the callback + // function, and delete the symbol path and all files under it + if (!ClearPathFile(symbolsPath, finish, parseELFFile)) { + return false; + } + return true; +} #endif bool RpcServer::SplitFile(std::string timeSnaps) diff --git a/trace_streamer/src/rpc/rpc_server.h b/trace_streamer/src/rpc/rpc_server.h index 7169c03d..533bb314 100644 --- a/trace_streamer/src/rpc/rpc_server.h +++ b/trace_streamer/src/rpc/rpc_server.h @@ -73,17 +73,21 @@ public: bool SaveAndParseFfrtData(const uint8_t* data, size_t len, ResultCallBack resultCallBack, bool isFinish); bool ReadAndParseData(const std::string& filePath); bool SendConvertedFfrtFile(const std::string& fileName, ResultCallBack resultCallBack); - int32_t DownloadELFCallback(const std::string& fileName, - size_t totalLen, - const uint8_t* data, - size_t len, - int32_t finish, - ParseELFFileCallBack parseELFFile); + void CreateFilePath(const std::string& filePath); + bool WriteToFile(const std::string& fileName, const uint8_t* data, size_t len); + bool ClearPathFile(string& symbolsPath, int32_t finish, ParseELFFileCallBack& parseELFFile); + bool DownloadELFCallback(const std::string& fileName, + size_t totalLen, + const uint8_t* data, + size_t len, + int32_t finish, + ParseELFFileCallBack parseELFFile); #endif std::map g_thirdPartyConfig; private: void ProcPerfSplitResult(SplitFileCallBack splitFileCallBack, bool isLast); + void ProcHtraceSplitResult(SplitFileCallBack splitFileCallBack); bool SendBytraceSplitFileData(SplitFileCallBack splitFileCallBack, int32_t isFinish); private: diff --git a/trace_streamer/src/trace_data/sqllite_prepar_cache_data.cpp b/trace_streamer/src/trace_data/sqllite_prepar_cache_data.cpp index b5dead02..7acc3560 100644 --- a/trace_streamer/src/trace_data/sqllite_prepar_cache_data.cpp +++ b/trace_streamer/src/trace_data/sqllite_prepar_cache_data.cpp @@ -110,6 +110,15 @@ static inline std::string Sqlite3ColumnText(sqlite3_stmt* stmt, uint8_t curCol) } SqllitePreparCacheData::SqllitePreparCacheData() +{ + FillSphQueryFuncMapPartOne(); + FillSphQueryFuncMapPartTow(); + FillSphQueryFuncMapPartThree(); + FillSphQueryFuncMapPartFour(); + FillSphQueryFuncMapPartFive(); +} + +void SqllitePreparCacheData::FillSphQueryFuncMapPartOne() { sphQueryFuncMap_ = { {static_cast(SphQueryType::CPU_DATA), @@ -139,177 +148,193 @@ SqllitePreparCacheData::SqllitePreparCacheData() {static_cast(SphQueryType::PROCESS_STARTUP_DATA), std::bind(&SqllitePreparCacheData::FillAndSendProcessStartupDataProto, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::PROCESS_SO_INIT_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendProcessSoInitDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::HI_SYS_EVENT_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendHiSysEventDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::LOG_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendLogDataProto, this, std::placeholders::_1, std::placeholders::_2, - std::placeholders::_3)}, - {static_cast(SphQueryType::VIRTUAL_MEM_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendVirtualMemDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::ENERGY_SYSTEM_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendEnergyDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::ENERGY_STATE_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendEnergyDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::ENERGY_ANOMAL_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendEnergyDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::FRAME_EXPECTED_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendFrameDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::FRAME_ACTUAL_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendFrameDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::FRAME_ANIMATION_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendFrameAnimationDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::FRAME_DYNAMIC_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendFrameDynamicDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::FRAME_SPACING_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendFrameSpacingDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::PROCESS_EXPECTED_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendProcessJanksFramesDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::PROCESS_ACTUAL_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendProcessJanksActualDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::PROCESS_DELIVER_INPUT_EVENT_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendProcessInputEventDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::THREAD_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendProcessThreadDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::FUNC_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendProcessFuncDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::ENERGY_POWER_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendEnergyDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::FILE_SYSTEM_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendEbpfDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::DISK_IO_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendEbpfDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::FILE_SYS_VM), - std::bind(&SqllitePreparCacheData::FillAndSendEbpfDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::VM_TRACKER_SMAPS_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendTrackerDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::VM_TRACKER_DMA_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendTrackerDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::VM_TRACKER_GPU_MEMORY_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendTrackerDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::VM_TRACKER_GPU_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendTrackerDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::VM_TRACKER_GPU_RESOURCE_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendTrackerDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::VM_TRACKER_GPU_TATAL_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendTrackerDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::VM_TRACKER_GPU_WINDOW_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendTrackerDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::VM_TRACKER_GPU_SHM_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendTrackerDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::VM_TRACKER_GPU_PURGEABLE_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendTrackerDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::ABILITY_MEMORY_USED_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendAbilityDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::CPU_ABILITY_USER_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendCpuAbilityDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::CPU_ABILITY_SYSTEM_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendCpuAbilityDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::CPU_ABILITY_MONITOR_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendCpuAbilityDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::ABILITY_BYTES_READ_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendAbilityDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::ABILITY_BYTES_WRITTEN_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendAbilityDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::ABILITY_READ_OPS_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendAbilityDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::ABILITY_WRITTEN_OPS_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendAbilityDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::ABILITY_BYTES_IN_TRACE_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendAbilityDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::ABILITY_BUTES_OUT_TRACE_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendAbilityDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::ABILITY_PACKET_IN_TRACE_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendAbilityDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::ABILITY_PACKETS_OUT_TRACE_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendAbilityDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::ABILITY_PURGEABLE_DAT), - std::bind(&SqllitePreparCacheData::FillAndSendTrackerDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::ABILITY_GPU_MEMMORY_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendTrackerDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::ABILITY_DMA_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendTrackerDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::HEAP_TIME_LINE_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendHeapFilesDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::HEAP_SNAPSHOT_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendHeapFilesDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::CPU_PROFILER_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendCpuProfilerDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::HIPERF_CPU_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendHiperfDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::HIPERF_PROCESS_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendHiperfDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::HIPERF_THREAD_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendHiperfDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::HIPERF_THREAD_DATA), - std::bind(&SqllitePreparCacheData::FillAndSendHiperfDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::HIPERF_CALL_CHART), - std::bind(&SqllitePreparCacheData::FillAndSendHiperfCallChartDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::HIPERF_CALL_STACK), - std::bind(&SqllitePreparCacheData::FillAndSendHiperfCallStackDataProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::NATIVE_MEMORY_CHART_CACHE_NORMAL), - std::bind(&SqllitePreparCacheData::FillAndSendNativeMemoryNormalProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, - {static_cast(SphQueryType::NATIVE_MEMORY_CHART_CACHE_STATISTIC), - std::bind(&SqllitePreparCacheData::FillAndSendNativeMemoryStatisticProto, this, std::placeholders::_1, - std::placeholders::_2, std::placeholders::_3)}, }; } +void SqllitePreparCacheData::FillSphQueryFuncMapPartTow() +{ + sphQueryFuncMap_.emplace(static_cast(SphQueryType::PROCESS_SO_INIT_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendProcessSoInitDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::HI_SYS_EVENT_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendHiSysEventDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::LOG_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendLogDataProto, this, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::VIRTUAL_MEM_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendVirtualMemDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::ENERGY_SYSTEM_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendEnergyDataProto, this, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::ENERGY_STATE_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendEnergyDataProto, this, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::ENERGY_ANOMAL_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendEnergyDataProto, this, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::FRAME_EXPECTED_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendFrameDataProto, this, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::FRAME_ACTUAL_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendFrameDataProto, this, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::FRAME_ANIMATION_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendFrameAnimationDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::FRAME_DYNAMIC_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendFrameDynamicDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::FRAME_SPACING_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendFrameSpacingDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::PROCESS_EXPECTED_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendProcessJanksFramesDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::PROCESS_ACTUAL_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendProcessJanksActualDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::PROCESS_DELIVER_INPUT_EVENT_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendProcessInputEventDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); +} + +void SqllitePreparCacheData::FillSphQueryFuncMapPartThree() +{ + sphQueryFuncMap_.emplace(static_cast(SphQueryType::THREAD_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendProcessThreadDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::FUNC_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendProcessFuncDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::ENERGY_POWER_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendEnergyDataProto, this, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::FILE_SYSTEM_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendEbpfDataProto, this, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::DISK_IO_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendEbpfDataProto, this, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::FILE_SYS_VM), + std::bind(&SqllitePreparCacheData::FillAndSendEbpfDataProto, this, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::VM_TRACKER_SMAPS_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendTrackerDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::VM_TRACKER_DMA_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendTrackerDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::VM_TRACKER_GPU_MEMORY_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendTrackerDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::VM_TRACKER_GPU_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendTrackerDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::VM_TRACKER_GPU_RESOURCE_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendTrackerDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::VM_TRACKER_GPU_TATAL_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendTrackerDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::VM_TRACKER_GPU_WINDOW_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendTrackerDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::VM_TRACKER_GPU_SHM_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendTrackerDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::VM_TRACKER_GPU_PURGEABLE_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendTrackerDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); +} + +void SqllitePreparCacheData::FillSphQueryFuncMapPartFour() +{ + sphQueryFuncMap_.emplace(static_cast(SphQueryType::ABILITY_MEMORY_USED_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendAbilityDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::CPU_ABILITY_USER_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendCpuAbilityDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::CPU_ABILITY_SYSTEM_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendCpuAbilityDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::CPU_ABILITY_MONITOR_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendCpuAbilityDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::ABILITY_BYTES_READ_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendAbilityDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::ABILITY_BYTES_WRITTEN_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendAbilityDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::ABILITY_READ_OPS_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendAbilityDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::ABILITY_WRITTEN_OPS_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendAbilityDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::ABILITY_BYTES_IN_TRACE_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendAbilityDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::ABILITY_BUTES_OUT_TRACE_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendAbilityDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::ABILITY_PACKET_IN_TRACE_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendAbilityDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::ABILITY_PACKETS_OUT_TRACE_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendAbilityDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::ABILITY_PURGEABLE_DAT), + std::bind(&SqllitePreparCacheData::FillAndSendTrackerDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::ABILITY_GPU_MEMMORY_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendTrackerDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); +} + +void SqllitePreparCacheData::FillSphQueryFuncMapPartFive() +{ + sphQueryFuncMap_.emplace(static_cast(SphQueryType::ABILITY_DMA_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendTrackerDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::HEAP_TIME_LINE_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendHeapFilesDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::HEAP_SNAPSHOT_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendHeapFilesDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::CPU_PROFILER_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendCpuProfilerDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::HIPERF_CPU_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendHiperfDataProto, this, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::HIPERF_PROCESS_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendHiperfDataProto, this, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::HIPERF_THREAD_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendHiperfDataProto, this, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::HIPERF_THREAD_DATA), + std::bind(&SqllitePreparCacheData::FillAndSendHiperfDataProto, this, std::placeholders::_1, + std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::HIPERF_CALL_CHART), + std::bind(&SqllitePreparCacheData::FillAndSendHiperfCallChartDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::HIPERF_CALL_STACK), + std::bind(&SqllitePreparCacheData::FillAndSendHiperfCallStackDataProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::NATIVE_MEMORY_CHART_CACHE_NORMAL), + std::bind(&SqllitePreparCacheData::FillAndSendNativeMemoryNormalProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); + sphQueryFuncMap_.emplace(static_cast(SphQueryType::NATIVE_MEMORY_CHART_CACHE_STATISTIC), + std::bind(&SqllitePreparCacheData::FillAndSendNativeMemoryStatisticProto, this, + std::placeholders::_1, std::placeholders::_2, std::placeholders::_3)); +} + template static bool SendDBProto(uint32_t type, const int32_t isFinish, diff --git a/trace_streamer/src/trace_data/sqllite_prepar_cache_data.h b/trace_streamer/src/trace_data/sqllite_prepar_cache_data.h index 8bab85dc..e290c454 100644 --- a/trace_streamer/src/trace_data/sqllite_prepar_cache_data.h +++ b/trace_streamer/src/trace_data/sqllite_prepar_cache_data.h @@ -71,6 +71,11 @@ private: void FillAndSendNativeMemoryNormalProto(sqlite3_stmt* stmt, uint32_t type, TLVResultCallBack TLVResultCallBack); void FillAndSendNativeMemoryStatisticProto(sqlite3_stmt* stmt, uint32_t type, TLVResultCallBack TLVResultCallBack); void FillAndSendCpuAbilityDataProto(sqlite3_stmt* stmt, uint32_t type, TLVResultCallBack TLVResultCallBack); + void FillSphQueryFuncMapPartOne(); + void FillSphQueryFuncMapPartTow(); + void FillSphQueryFuncMapPartThree(); + void FillSphQueryFuncMapPartFour(); + void FillSphQueryFuncMapPartFive(); }; } // namespace TraceStreamer } // namespace SysTuning diff --git a/trace_streamer/src/trace_data/trace_data_cache.cpp b/trace_streamer/src/trace_data/trace_data_cache.cpp index 9a15a96c..4ab6edbf 100644 --- a/trace_streamer/src/trace_data/trace_data_cache.cpp +++ b/trace_streamer/src/trace_data/trace_data_cache.cpp @@ -315,48 +315,55 @@ int32_t TraceDataCache::ExportPerfReadableText(const std::string& outputName, std::string perfBufferLine; perfBufferLine.reserve(G_CHUNK_SIZE); for (uint64_t row = 0; row < perfSample_.Size();) { - std::string perfTaskName; - std::string cpuIdStr = std::to_string(perfSample_.CpuIds()[row]); - std::string eventTypeName; - auto perfTaskId = perfSample_.Tids()[row]; - if (perfTaskId == 0) { - auto threadDataRow = 0; - perfTaskName = GetDataFromDict(GetConstThreadData(threadDataRow).nameIndex_); - } else { - auto perfThreadTidItor = std::find(perfThread_.Tids().begin(), perfThread_.Tids().end(), perfTaskId); - if (perfThreadTidItor != perfThread_.Tids().end()) { - auto perfThreadRow = std::distance(perfThread_.Tids().begin(), perfThreadTidItor); - perfTaskName = GetDataFromDict(perfThread_.ThreadNames()[perfThreadRow]); - } - } - auto perfReportIdItor = - std::find(perfReport_.IdsData().begin(), perfReport_.IdsData().end(), perfSample_.EventTypeIds()[row]); - if (perfReportIdItor != perfReport_.IdsData().end()) { - auto perfReportRow = std::distance(perfReport_.IdsData().begin(), perfReportIdItor); - eventTypeName = GetDataFromDict(perfReport_.Values()[perfReportRow]); - } - perfBufferLine.append(perfTaskName); - perfBufferLine.append(" ").append(std::to_string(perfTaskId)); - perfBufferLine.append(" [") - .append(std::string(CPU_ID_FORMAT_WIDTH - cpuIdStr.size(), '0')) - .append(cpuIdStr) - .append("]"); - perfBufferLine.append(" ") - .append(base::ConvertTimestampToSecStr(perfSample_.TimeStampData()[row], TIME_PRECISION_SIX)) - .append(":"); - perfBufferLine.append(" ").append(std::to_string(perfSample_.EventCounts()[row])); - perfBufferLine.append(" ").append(eventTypeName).append(" \r\n"); - ExportPerfCallChaninText(perfSample_.SampleIds()[row], perfBufferLine); - if (++row != perfSample_.Size() && perfBufferLine.size() < FLUSH_CHUNK_THRESHOLD) { - continue; - } + ExportPerfSampleToFile(perfBufferLine, perfFd, outputName, row); TS_CHECK_TRUE(write(perfFd, perfBufferLine.data(), perfBufferLine.size()) != -1, 1, "Failed to write file: %s, err:%s", outputName.c_str(), strerror(errno)); perfBufferLine.clear(); + if (++row != perfSample_.Size() && perfBufferLine.size() < FLUSH_CHUNK_THRESHOLD) { + continue; + } } TS_LOGI("ExportPerfReadableText end..."); return 0; } +void TraceDataCache::ExportPerfSampleToFile(std::string& perfBufferLine, + int32_t perfFd, + const std::string& outputName, + uint64_t row) +{ + std::string perfTaskName; + std::string cpuIdStr = std::to_string(perfSample_.CpuIds()[row]); + std::string eventTypeName; + auto perfTaskId = perfSample_.Tids()[row]; + if (perfTaskId == 0) { + auto threadDataRow = 0; + perfTaskName = GetDataFromDict(GetConstThreadData(threadDataRow).nameIndex_); + } else { + auto perfThreadTidItor = std::find(perfThread_.Tids().begin(), perfThread_.Tids().end(), perfTaskId); + if (perfThreadTidItor != perfThread_.Tids().end()) { + auto perfThreadRow = std::distance(perfThread_.Tids().begin(), perfThreadTidItor); + perfTaskName = GetDataFromDict(perfThread_.ThreadNames()[perfThreadRow]); + } + } + auto perfReportIdItor = + std::find(perfReport_.IdsData().begin(), perfReport_.IdsData().end(), perfSample_.EventTypeIds()[row]); + if (perfReportIdItor != perfReport_.IdsData().end()) { + auto perfReportRow = std::distance(perfReport_.IdsData().begin(), perfReportIdItor); + eventTypeName = GetDataFromDict(perfReport_.Values()[perfReportRow]); + } + perfBufferLine.append(perfTaskName); + perfBufferLine.append(" ").append(std::to_string(perfTaskId)); + perfBufferLine.append(" [") + .append(std::string(CPU_ID_FORMAT_WIDTH - cpuIdStr.size(), '0')) + .append(cpuIdStr) + .append("]"); + perfBufferLine.append(" ") + .append(base::ConvertTimestampToSecStr(perfSample_.TimeStampData()[row], TIME_PRECISION_SIX)) + .append(":"); + perfBufferLine.append(" ").append(std::to_string(perfSample_.EventCounts()[row])); + perfBufferLine.append(" ").append(eventTypeName).append(" \r\n"); + ExportPerfCallChaninText(perfSample_.SampleIds()[row], perfBufferLine); +} void TraceDataCache::ExportPerfCallChaninText(uint32_t callChainId, std::string& bufferLine) { std::stack callChainStackRows; diff --git a/trace_streamer/src/trace_data/trace_data_cache.h b/trace_streamer/src/trace_data/trace_data_cache.h index 2d18e197..bd862249 100644 --- a/trace_streamer/src/trace_data/trace_data_cache.h +++ b/trace_streamer/src/trace_data/trace_data_cache.h @@ -74,6 +74,10 @@ private: void InitRenderServiceDB(); void InitMemoryDB(); void InitHisysEventDB(); + void ExportPerfSampleToFile(std::string& perfBufferLine, + int32_t perfFd, + const std::string& outputName, + uint64_t row); private: bool dbInited_ = false; diff --git a/trace_streamer/test/unittest/htrace/native_memory/native_hook_parser_test.cpp b/trace_streamer/test/unittest/htrace/native_memory/native_hook_parser_test.cpp index f96c7528..be3a837a 100644 --- a/trace_streamer/test/unittest/htrace/native_memory/native_hook_parser_test.cpp +++ b/trace_streamer/test/unittest/htrace/native_memory/native_hook_parser_test.cpp @@ -237,6 +237,15 @@ public: nativeHookData->set_allocated_munmap_event(munmapEvent); } + BatchNativeHookData CreateBatchNativeHookData(std::string& hookStrMsg) + { + BatchNativeHookData batchNativeHookData; + SetAllocEvent(batchNativeHookData, {TID_01, ADDR_01, SIZE_01, "", SEC_01, NSEC_01}, true); + SetAllocEvent(batchNativeHookData, {TID_02, ADDR_02, SIZE_02, "", SEC_02, NSEC_02}, true); + batchNativeHookData.SerializeToString(&hookStrMsg); + return batchNativeHookData; + } + public: SysTuning::TraceStreamer::TraceStreamerSelector stream_ = {}; }; @@ -552,74 +561,45 @@ HWTEST_F(NativeHookParserTest, ParseBatchNativeHookWithOneMalloc, TestSize.Level HWTEST_F(NativeHookParserTest, ParseBatchNativeHookWithMultipleMalloc, TestSize.Level1) { TS_LOGI("test24-3"); - - // construct BatchNativeHookData - BatchNativeHookData batchNativeHookData; - SetAllocEvent(batchNativeHookData, {TID_01, ADDR_01, SIZE_01, "", SEC_01, NSEC_01}, true); - SetAllocEvent(batchNativeHookData, {TID_02, ADDR_02, SIZE_02, "", SEC_02, NSEC_02}, true); std::string hookStrMsg = ""; - batchNativeHookData.SerializeToString(&hookStrMsg); - + BatchNativeHookData batchNativeHookData = CreateBatchNativeHookData(hookStrMsg); HtraceDataSegment dataSeg; dataSeg.seg = std::make_shared(hookStrMsg); ProtoReader::BytesView hookBytesView(reinterpret_cast(hookStrMsg.data()), hookStrMsg.size()); dataSeg.protoData = hookBytesView; - - // start parse HtraceNativeHookParser htraceNativeHookParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); bool hasSplit = false; htraceNativeHookParser.Parse(dataSeg, hasSplit); htraceNativeHookParser.FinishParseNativeHookData(); - - // Verification parse NativeHook results - // Calculate partial expectations const NativeHook& nativeHook = stream_.traceDataCache_->GetConstNativeHookData(); const NativeHookFrame& nativeHookFrame = stream_.traceDataCache_->GetConstNativeHookFrameData(); auto expect_ipid = stream_.streamFilters_->processFilter_->GetInternalPid(PID); auto expect_itid = stream_.streamFilters_->processFilter_->GetInternalTid(TID_01); EXPECT_TRUE(SIZE_01 == nativeHook.AllMemSizes()[0]); EXPECT_TRUE(nativeHook.CurrentSizeDurs()[0] == TIMESTAMP_02 - TIMESTAMP_01); - - // Construct the nativehookcache object using the element with subscript 0 in nativehook and compare it with the - // expected value NativeHookCache firstExpectNativeHookCache(1, expect_ipid, expect_itid, ALLOCEVENT.c_str(), INVALID_UINT64, TIMESTAMP_01, 0, 0, ADDR_01, SIZE_01, SIZE_01, TIMESTAMP_02 - TIMESTAMP_01); NativeHookCache firstResultNativeHookCache(nativeHook, 0); EXPECT_TRUE(firstExpectNativeHookCache == firstResultNativeHookCache); - - // construct first Malloc event's first frame expect value. - // Note: the nativehookframe data is parsed in reverse order auto firstExpectSymbol = stream_.traceDataCache_->dataDict_.GetStringIndex(SYMBOL_NAME_02); auto firstExpectFilePath = stream_.traceDataCache_->dataDict_.GetStringIndex(FILE_PATH_02); NativeHookFrameCache firstMallocExpectFirstFrame(1, 0, IP_02, firstExpectSymbol, firstExpectFilePath, OFFSET_02, SYMBOL_OFFSET_02); - // Construct the NativeHookFrameCache object using the element with subscript 0 in NativeHookFrame and compare it - // with the expected value EXPECT_TRUE(firstMallocExpectFirstFrame == NativeHookFrameCache(nativeHookFrame, 0)); - - // construct first Malloc event's second frame expect value. auto secondExpectSymbol = stream_.traceDataCache_->dataDict_.GetStringIndex(SYMBOL_NAME_01); auto secondExpectFilePath = stream_.traceDataCache_->dataDict_.GetStringIndex(FILE_PATH_01); NativeHookFrameCache firstMallocExpectSecondFrame(1, 1, IP_01, secondExpectSymbol, secondExpectFilePath, OFFSET_01, SYMBOL_OFFSET_01); NativeHookFrameCache firstMallocResultSecondFrame(nativeHookFrame, 1); EXPECT_TRUE(firstMallocExpectSecondFrame == firstMallocResultSecondFrame); - - // Construct the nativehookcache object using the element with subscript 1 in nativehook and compare it with the - // expected value expect_itid = stream_.streamFilters_->processFilter_->GetInternalTid(TID_02); NativeHookCache secondExpectNativeHookCache(1, expect_ipid, expect_itid, ALLOCEVENT.c_str(), INVALID_UINT64, TIMESTAMP_02, 0, 0, ADDR_02, SIZE_02, SIZE_01 + SIZE_02, 0); NativeHookCache secondResultNativeHookCache(nativeHook, 1); EXPECT_TRUE(secondExpectNativeHookCache == secondResultNativeHookCache); - - // construct second Malloc event's first frame expect value. - // Note: the nativehookframe data is parsed in reverse order NativeHookFrameCache secondMallocExpectFirstFrame(1, 0, IP_02, firstExpectSymbol, firstExpectFilePath, OFFSET_02, SYMBOL_OFFSET_02); - // Construct the NativeHookFrameCache object using the element with subscript 2 in NativeHookFrame and compare it - // Verify the compression algorithm here= EXPECT_EQ(nativeHookFrame.CallChainIds()[1], 1); EXPECT_EQ(nativeHookFrame.Depths()[1], 1); EXPECT_EQ(nativeHookFrame.Ips()[1], IP_01); @@ -1047,13 +1027,9 @@ HWTEST_F(NativeHookParserTest, ParseBatchNativeHookWithOneMunmap, TestSize.Level HWTEST_F(NativeHookParserTest, ParseBatchNativeHookWithMultipleMmap, TestSize.Level1) { TS_LOGI("test24-12"); - - // construct BatchNativeHookData BatchNativeHookData batchNativeHookData; SetMmapEvent(batchNativeHookData, {TID_01, ADDR_01, SIZE_01, TYPE_01, SEC_01, NSEC_01}); SetMmapEvent(batchNativeHookData, {TID_02, ADDR_02, SIZE_02, TYPE_02, SEC_02, NSEC_02}, false, true); - - // start parse HtraceNativeHookParser htraceNativeHookParser(stream_.traceDataCache_.get(), stream_.streamFilters_.get()); std::string hookStrMsg = ""; batchNativeHookData.SerializeToString(&hookStrMsg); @@ -1064,8 +1040,6 @@ HWTEST_F(NativeHookParserTest, ParseBatchNativeHookWithMultipleMmap, TestSize.Le bool hasSplit = false; htraceNativeHookParser.Parse(dataSeg, hasSplit); htraceNativeHookParser.FinishParseNativeHookData(); - - // Verification parse NativeHook results const NativeHook& nativeHook = stream_.traceDataCache_->GetConstNativeHookData(); auto expect_ipid = stream_.streamFilters_->processFilter_->GetInternalPid(PID); auto expect_itid = stream_.streamFilters_->processFilter_->GetInternalTid(TID_01); @@ -1074,40 +1048,28 @@ HWTEST_F(NativeHookParserTest, ParseBatchNativeHookWithMultipleMmap, TestSize.Le NativeHookCache firstExpectNativeHookCache(1, expect_ipid, expect_itid, MMAPEVENT.c_str(), mmapSubType, TIMESTAMP_01, 0, 0, ADDR_01, SIZE_01, SIZE_01, TIMESTAMP_02 - TIMESTAMP_01); - NativeHookCache firstResultNativeHookCache(nativeHook, 0); - EXPECT_TRUE(firstExpectNativeHookCache == firstResultNativeHookCache); + EXPECT_TRUE(firstExpectNativeHookCache == NativeHookCache(nativeHook, 0)); expect_itid = stream_.streamFilters_->processFilter_->GetInternalTid(TID_02); mmapSubType = stream_.traceDataCache_->dataDict_.GetStringIndex(TYPE_02); NativeHookCache secondExpectNativeHookCache(2, expect_ipid, expect_itid, MMAPEVENT.c_str(), mmapSubType, TIMESTAMP_02, 0, 0, ADDR_02, SIZE_02, SIZE_01 + SIZE_02, 0); - NativeHookCache secondResultNativeHookCache(nativeHook, 1); - EXPECT_TRUE(secondExpectNativeHookCache == secondResultNativeHookCache); - auto size = stream_.traceDataCache_->GetConstNativeHookData().Size(); - EXPECT_EQ(2, size); - - // Verification parse NativeHook Frame results + EXPECT_TRUE(secondExpectNativeHookCache == NativeHookCache(nativeHook, 1)); + EXPECT_EQ(2, stream_.traceDataCache_->GetConstNativeHookData().Size()); const NativeHookFrame& nativeHookFrame = stream_.traceDataCache_->GetConstNativeHookFrameData(); auto expectSymbolData = stream_.traceDataCache_->dataDict_.GetStringIndex(SYMBOL_NAME_01); auto expectFilePathData = stream_.traceDataCache_->dataDict_.GetStringIndex(FILE_PATH_01); NativeHookFrameCache firstExpectFrameCache(1, 0, IP_01, expectSymbolData, expectFilePathData, OFFSET_01, SYMBOL_OFFSET_01); - NativeHookFrameCache firstResultFrameCache(nativeHookFrame, 0); - EXPECT_TRUE(firstExpectFrameCache == firstResultFrameCache); + EXPECT_TRUE(firstExpectFrameCache == NativeHookFrameCache(nativeHookFrame, 0)); expectSymbolData = stream_.traceDataCache_->dataDict_.GetStringIndex(SYMBOL_NAME_02); expectFilePathData = stream_.traceDataCache_->dataDict_.GetStringIndex(FILE_PATH_02); NativeHookFrameCache expectFrameCache(2, 0, IP_02, expectSymbolData, expectFilePathData, OFFSET_02, SYMBOL_OFFSET_02); - NativeHookFrameCache resultFrameCache(nativeHookFrame, 1); - EXPECT_TRUE(expectFrameCache == resultFrameCache); - - size = nativeHookFrame.Size(); - EXPECT_EQ(2, size); - - auto eventCount = - stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_NATIVE_HOOK_MMAP, STAT_EVENT_RECEIVED); - EXPECT_TRUE(2 == eventCount); + EXPECT_TRUE(expectFrameCache == NativeHookFrameCache(nativeHookFrame, 1)); + EXPECT_EQ(2, nativeHookFrame.Size()); + EXPECT_EQ(2, stream_.traceDataCache_->GetConstStatAndInfo().GetValue(TRACE_NATIVE_HOOK_MMAP, STAT_EVENT_RECEIVED)); } /** -- Gitee