diff --git a/ide/src/trace/bean/BoxSelection.ts b/ide/src/trace/bean/BoxSelection.ts index 8dede09ca4882d80beb1cd0989cd84e4f291bca3..59ec215b7d5c3e3df9d6d78c29f048226f7d44bd 100644 --- a/ide/src/trace/bean/BoxSelection.ts +++ b/ide/src/trace/bean/BoxSelection.ts @@ -23,16 +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"; +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; @@ -64,8 +64,10 @@ export class SelectionParam { processTrackIds: Array = []; virtualTrackIds: Array = []; cpuFreqLimit: Array = []; - clockMapData: Map Promise> | undefined) | undefined> - = new Map (Promise> | undefined)) | undefined>(); + clockMapData: Map Promise> | undefined) | undefined> = new Map< + string, + ((arg: any) => Promise> | undefined) | undefined + >(); irqCallIds: Array = []; softIrqCallIds: Array = []; funTids: Array = []; @@ -127,12 +129,12 @@ export class SelectionParam { sysAllEventsData: Array = []; sysAlllogsData: Array = []; hiSysEvents: Array = []; - pushCpus(it:TraceRow){ + 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) { @@ -166,7 +168,7 @@ export class SelectionParam { } } - pushProcess(it: TraceRow,sp:SpSystemTrace) { + pushProcess(it: TraceRow, sp: SpSystemTrace) { if (it.rowType == TraceRow.ROW_TYPE_PROCESS) { sp.pushPidToSelection(this, it.rowId!); if (it.getAttribute('hasStartup') === 'true') { @@ -250,8 +252,8 @@ export class SelectionParam { 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) && + 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!); @@ -407,32 +409,38 @@ export class SelectionParam { } } } - vMTrackerGpuChildRowsEvery(item:TraceRow){ + 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; + 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) + 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) + 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; + 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) { @@ -485,7 +493,7 @@ export class SelectionParam { 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) < + Math.min(filterJank.ts!, rangeData!.startNS || 0) < filterJank.dur! + (rangeData!.endNS || 0) - (rangeData!.startNS || 0); if (it.name == 'Actual Timeline') { if (it.rowParentId === 'frameTime') { @@ -518,10 +526,9 @@ export class SelectionParam { 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; + const [rangeStart, rangeEnd] = [TraceRow.range?.startNS, TraceRow.range?.endNS]; + const endNS = TraceRow.rangeSelectObject?.endNS || rangeStart; + const startNS = TraceRow.rangeSelectObject?.startNS || rangeEnd; let minNodeId, maxNodeId; if (!it.dataListCache || it.dataListCache.length === 0) { return; @@ -547,18 +554,15 @@ export class SelectionParam { minNodeId = it.dataListCache[it.dataListCache.length - 1].lastAssignedId; } // If you select the box from the beginning - if (startNS! <= TraceRow.range?.startNS!) { + if (startNS! <= rangeStart!) { 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 - ) { + if (endNS! >= rangeEnd! || 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') + 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); @@ -732,7 +736,7 @@ export class SelectionParam { 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) < + 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!); @@ -948,16 +952,16 @@ export class SelectionParam { 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.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); @@ -969,28 +973,28 @@ export class SelectionParam { 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); + 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); } } diff --git a/ide/src/trace/component/SpRecordConfigModel.ts b/ide/src/trace/component/SpRecordConfigModel.ts index 4a25301b1626914668606b070babca7f15bd2fbf..7101db4151e667c25c03241d7201c426d100a2a8 100644 --- a/ide/src/trace/component/SpRecordConfigModel.ts +++ b/ide/src/trace/component/SpRecordConfigModel.ts @@ -602,39 +602,42 @@ function initHiPerfConfig( perfConfig: PerfConfig | undefined, recordArgs: string ): string{ - if (perfConfig?.cpu && !perfConfig?.cpu.includes('ALL') && perfConfig?.cpu.length > 0) { - recordArgs = `${recordArgs} -c ${perfConfig?.cpu}`; + if (!perfConfig){ + return ''; } - if (perfConfig?.cpuPercent !== 0) { - recordArgs = `${recordArgs} --cpu-limit ${perfConfig?.cpuPercent}`; + if (perfConfig.cpu && !perfConfig.cpu.includes('ALL') && perfConfig.cpu.length > 0) { + recordArgs = `${recordArgs} -c ${perfConfig.cpu}`; } - if (perfConfig?.eventList && !perfConfig?.eventList.includes('NONE') && perfConfig?.eventList.length > 0) { - recordArgs = `${recordArgs} -e ${perfConfig?.eventList}`; - if (perfConfig?.isOffCpu) { + if (perfConfig.cpuPercent !== 0) { + recordArgs = `${recordArgs} --cpu-limit ${perfConfig.cpuPercent}`; + } + if (perfConfig.eventList && !perfConfig.eventList.includes('NONE') && perfConfig.eventList.length > 0) { + recordArgs = `${recordArgs} -e ${perfConfig.eventList}`; + if (perfConfig.isOffCpu) { recordArgs = `${recordArgs},sched:sched_waking`; } } else { recordArgs = `${recordArgs} -e hw-cpu-cycles`; - if (perfConfig?.isOffCpu) { + if (perfConfig.isOffCpu) { recordArgs = `${recordArgs},sched:sched_waking`; } } - if (perfConfig?.callStack !== 'none') { - recordArgs = `${recordArgs} --call-stack ${perfConfig?.callStack}`; + if (perfConfig.callStack !== 'none') { + recordArgs = `${recordArgs} --call-stack ${perfConfig.callStack}`; } - if (perfConfig?.branch !== 'none') { - recordArgs = `${recordArgs} -j ${perfConfig?.branch}`; + if (perfConfig.branch !== 'none') { + recordArgs = `${recordArgs} -j ${perfConfig.branch}`; } - if (perfConfig?.clockType) { - recordArgs = `${recordArgs} --clockid ${perfConfig?.clockType}`; + if (perfConfig.clockType) { + recordArgs = `${recordArgs} --clockid ${perfConfig.clockType}`; } - if (perfConfig?.isOffCpu) { + if (perfConfig.isOffCpu) { recordArgs = `${recordArgs} --offcpu`; } - if (perfConfig?.noInherit) { + if (perfConfig.noInherit) { recordArgs = `${recordArgs} --no-inherit`; } - if (perfConfig?.mmap) { + if (perfConfig.mmap) { recordArgs = `${recordArgs} -m ${perfConfig.mmap}`; } return recordArgs; diff --git a/ide/src/trace/component/SpRecordTrace.ts b/ide/src/trace/component/SpRecordTrace.ts index f30f0f08d9e9042c079ab31622b49ef967ba8bcf..4dc2c5ad04daa58bbfb40f90bdbb1cd2fadbd661 100644 --- a/ide/src/trace/component/SpRecordTrace.ts +++ b/ide/src/trace/component/SpRecordTrace.ts @@ -58,7 +58,11 @@ import { createMonitorPlugin, createNativePluginConfig, createSessionRequest, - createSystemConfig, createSdkConfig, createHiSystemEventPluginConfig, createArkTsConfig, createHiLogConfig, + createSystemConfig, + createSdkConfig, + createHiSystemEventPluginConfig, + createArkTsConfig, + createHiLogConfig, } from './SpRecordConfigModel'; import { SpRecordTraceHtml } from './SpRecordTrace.html'; @@ -329,20 +333,23 @@ export class SpRecordTrace extends BaseElement { if (parentElement) { parentElement.style.overflow = 'hidden'; } + if (!this.shadowRoot || !this.sp){ + return; + } this.initConfigPage(); - this.hintEl = this.shadowRoot?.querySelector('#hint') as HTMLSpanElement; - this.deviceSelect = this.shadowRoot?.querySelector('#device-select') as HTMLSelectElement; - this.deviceVersion = this.shadowRoot?.querySelector('#device-version') as HTMLSelectElement; - this.devicePrompt = this.shadowRoot?.querySelector('.prompt') as HTMLSpanElement; - this.disconnectButton = this.shadowRoot?.querySelector('.disconnect'); - this.recordButton = this.shadowRoot?.querySelector('.record') as LitButton; - this.recordButtonText = this.shadowRoot?.querySelector('.record_text') as HTMLSpanElement; - this.cancelButton = this.shadowRoot?.querySelector('.cancel') as LitButton; + this.hintEl = this.shadowRoot.querySelector('#hint') as HTMLSpanElement; + this.deviceSelect = this.shadowRoot.querySelector('#device-select') as HTMLSelectElement; + this.deviceVersion = this.shadowRoot.querySelector('#device-version') as HTMLSelectElement; + this.devicePrompt = this.shadowRoot.querySelector('.prompt') as HTMLSpanElement; + this.disconnectButton = this.shadowRoot.querySelector('.disconnect'); + this.recordButton = this.shadowRoot.querySelector('.record') as LitButton; + this.recordButtonText = this.shadowRoot.querySelector('.record_text') as HTMLSpanElement; + this.cancelButton = this.shadowRoot.querySelector('.cancel') as LitButton; this.sp = document.querySelector('sp-application') as SpApplication; - this.progressEL = this.sp?.shadowRoot?.querySelector('.progress') as LitProgressBar; - this.litSearch = this.sp?.shadowRoot?.querySelector('#lit-record-search') as LitSearch; - this.menuGroup = this.shadowRoot?.querySelector('#menu-group') as LitMainMenuGroup; - this.addButton = this.shadowRoot?.querySelector('.add'); + this.progressEL = this.sp.shadowRoot?.querySelector('.progress') as LitProgressBar; + this.litSearch = this.sp.shadowRoot?.querySelector('#lit-record-search') as LitSearch; + this.menuGroup = this.shadowRoot.querySelector('#menu-group') as LitMainMenuGroup; + this.addButton = this.shadowRoot.querySelector('.add'); if (this.record_template) { this.buildTemplateTraceItem(); } else { @@ -350,14 +357,14 @@ export class SpRecordTrace extends BaseElement { } this.initMenuItems(); this.appendDeviceVersion(); - if (this.deviceSelect?.options && this.deviceSelect?.options.length > 0) { + if (this.deviceSelect.options && this.deviceSelect.options.length > 0) { this.disconnectButton!.hidden = false; - this.recordButton!.hidden = false; - this.devicePrompt!.innerText = ''; + this.recordButton.hidden = false; + this.devicePrompt.innerText = ''; } else { this.disconnectButton!.hidden = true; - this.recordButton!.hidden = true; - this.devicePrompt!.innerText = 'Device not connected'; + this.recordButton.hidden = true; + this.devicePrompt.innerText = 'Device not connected'; } } @@ -598,9 +605,12 @@ export class SpRecordTrace extends BaseElement { SpRecordTrace.supportVersions.forEach((supportVersion) => { let option = document.createElement('option'); option.className = 'select'; + option.selected = supportVersion === '4.0+'; option.textContent = `OpenHarmony-${supportVersion}`; option.setAttribute('device-version', supportVersion); this.deviceVersion!.append(option); + SpRecordTrace.selectVersion = '4.0+'; + this.nativeMemoryHideBySelectVersion(); }); } @@ -741,8 +751,7 @@ export class SpRecordTrace extends BaseElement { let recordModeSwitch = recordTrace.probesConfig?.shadowRoot?.querySelector('lit-switch') as LitSwitch; let checkDesBoxDis = recordTrace.probesConfig?.shadowRoot?.querySelectorAll('check-des-box'); let litCheckBoxDis = recordTrace.probesConfig?.shadowRoot?.querySelectorAll('lit-check-box'); - recordTrace.ftraceSlider = recordTrace.probesConfig?.shadowRoot?. - querySelector('#ftrace-buff-size-slider'); + recordTrace.ftraceSlider = recordTrace.probesConfig?.shadowRoot?.querySelector('#ftrace-buff-size-slider'); startNativeSwitch.addEventListener('change', (event: any): void => { let detail = event.detail; if (detail!.checked) { diff --git a/ide/src/trace/component/SpSystemTrace.event.ts b/ide/src/trace/component/SpSystemTrace.event.ts index 703dc8e0bc6fe11622257b9465f11397daaefab6..b86eaa4ec08d693d80b6fdf6502490a26fdf768f 100644 --- a/ide/src/trace/component/SpSystemTrace.event.ts +++ b/ide/src/trace/component/SpSystemTrace.event.ts @@ -89,6 +89,7 @@ function threadClickHandlerFunc(sp: SpSystemTrace) { `trace-row[row-id='${d.cpu}'][row-type='cpu-data']`, (row) => row.rowId === `${d.cpu}` && row.rowType === 'cpu-data' )[0]; + sp.currentRow = cpuRow; cpuRow.fixedList = [ { startTime: d.startTime, @@ -255,6 +256,7 @@ function cpuClickHandlerFunc(sp: SpSystemTrace) { `trace-row[row-id='${d.tid}'][row-type='thread']`, (row) => row.rowId === `${d.tid}` && row.rowType === 'thread' )[0]; + sp.currentRow = threadRow; if (threadRow) { threadRow.fixedList = [ { @@ -309,9 +311,9 @@ function AllStructOnClick(clickRowType:string,sp:SpSystemTrace,row?:TraceRow {}); } -export default function SpSystemTraceOnClickHandler(sp: SpSystemTrace, clickRowType: string, row?: TraceRow) { +export default function spSystemTraceOnClickHandler(sp: SpSystemTrace, clickRowType: string, row?: TraceRow) { if (row) { sp.currentRow = row; sp.setAttribute('clickRow', clickRowType); @@ -362,7 +364,7 @@ function handleMouseInTimeShaft(sp: SpSystemTrace, ev: MouseEvent) { return isMouseInTimeShaft; } -export function SpSystemTraceDocumentOnMouseMove(sp: SpSystemTrace, ev: MouseEvent) { +export function spSystemTraceDocumentOnMouseMove(sp: SpSystemTrace, ev: MouseEvent) { if (!sp.loadTraceCompleted || (window as any).flagInputFocus || !sp.mouseEventEnable) { return; } @@ -434,7 +436,7 @@ function SpSystemTraceDocumentOnMouseMoveMouseUp(sp: SpSystemTrace, rows: Array< requestAnimationFrame(() => sp.refreshCanvas(true)); } -export function SpSystemTraceDocumentOnMouseOut(sp: SpSystemTrace, ev: MouseEvent) { +export function spSystemTraceDocumentOnMouseOut(sp: SpSystemTrace, ev: MouseEvent) { if (!sp.loadTraceCompleted) { return; } @@ -491,7 +493,7 @@ export function SpSystemTraceDocumentOnKeyPress(sp: SpSystemTrace, ev: KeyboardE } } -export function SpSystemTraceDocumentOnMouseDown(sp: SpSystemTrace, ev: MouseEvent) { +export function spSystemTraceDocumentOnMouseDown(sp: SpSystemTrace, ev: MouseEvent) { if (!sp.loadTraceCompleted || !sp.mouseEventEnable) { return; } @@ -562,7 +564,7 @@ function handleTimerShaftActions(ev: MouseEvent, sp: SpSystemTrace) { } } -export function SpSystemTraceDocumentOnMouseUp(sp: SpSystemTrace, ev: MouseEvent) { +export function spSystemTraceDocumentOnMouseUp(sp: SpSystemTrace, ev: MouseEvent) { if ((window as any).collectResize) { return; } @@ -597,7 +599,7 @@ export function SpSystemTraceDocumentOnMouseUp(sp: SpSystemTrace, ev: MouseEvent sp.timerShaftEL?.documentOnMouseUp(ev); } -export function SpSystemTraceDocumentOnKeyUp(sp: SpSystemTrace, ev: KeyboardEvent) { +export function spSystemTraceDocumentOnKeyUp(sp: SpSystemTrace, ev: KeyboardEvent) { if (sp.times.size > 0) { for (let timerId of sp.times) { clearTimeout(timerId); @@ -636,11 +638,11 @@ export function SpSystemTraceDocumentOnKeyUp(sp: SpSystemTrace, ev: KeyboardEven document.addEventListener('keydown', sp.documentOnKeyDown); } if (ev.ctrlKey) { - SpSystemTraceDocumentOnKeyUpCtrlKey(keyPress, sp); + spSystemTraceDocumentOnKeyUpCtrlKey(keyPress, sp); } } -function SpSystemTraceDocumentOnKeyUpCtrlKey(keyPress: string, sp: SpSystemTrace) { +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) { @@ -674,7 +676,7 @@ function handleClickActions(sp: SpSystemTrace, x: number, y: number, ev: MouseEv } } -export function SpSystemTraceDocumentOnClick(sp: SpSystemTrace, ev: MouseEvent) { +export function spSystemTraceDocumentOnClick(sp: SpSystemTrace, ev: MouseEvent) { if (!sp.loadTraceCompleted) { return; } @@ -707,7 +709,7 @@ export function SpSystemTraceDocumentOnClick(sp: SpSystemTrace, ev: MouseEvent) ev.preventDefault(); } -export function SpSystemTraceDocumentOnKeyDown(sp: SpSystemTrace, ev: KeyboardEvent) { +export function spSystemTraceDocumentOnKeyDown(sp: SpSystemTrace, ev: KeyboardEvent) { document.removeEventListener('keyup', sp.documentOnKeyUp); sp.debounce(sp.continueSearch, 250, ev)(); document.addEventListener('keyup', sp.documentOnKeyUp); diff --git a/ide/src/trace/component/SpSystemTrace.init.ts b/ide/src/trace/component/SpSystemTrace.init.ts index a7d3c55012173d1778803d94cc0315e1c8556262..e09385f588c67987a9296ed6727ed83dd1d302e6 100644 --- a/ide/src/trace/component/SpSystemTrace.init.ts +++ b/ide/src/trace/component/SpSystemTrace.init.ts @@ -30,6 +30,9 @@ 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"; +import { TraceSheet } from './trace/base/TraceSheet'; +import { TimerShaftElement } from './trace/TimerShaftElement'; +import { SpChartList } from './trace/SpChartList'; type HTMLElementAlias = HTMLElement | null | undefined; function rightButtonOnClick(sp: SpSystemTrace,rightStar: HTMLElementAlias) { @@ -595,23 +598,26 @@ function smartEventSubscribe(sp: SpSystemTrace) { }); window.subscribe(window.SmartEvent.UI.CollectGroupChange, (group: string) => sp.currentCollectGroup = group); } -export function SpSystemTraceInitElement(sp:SpSystemTrace){ +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 + sp.traceSheetEL = sp.shadowRoot?.querySelector('.trace-sheet'); + if (!sp || !sp.shadowRoot || !sp.traceSheetEL){ + return; + } + 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 + 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.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.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)); @@ -636,7 +642,7 @@ export function SpSystemTraceInitElement(sp:SpSystemTrace){ observerHandler(sp); window.addEventListener('keydown', windowKeyDownHandler(sp)); sp.chartManager = new SpChartManager(sp); - sp.canvasPanel = sp.shadowRoot!.querySelector('#canvas-panel')!; + sp.canvasPanel = sp.shadowRoot.querySelector('#canvas-panel')!; sp.canvasPanelCtx = sp.canvasPanel.getContext('2d'); sp.canvasFavoritePanelCtx = sp.favoriteChartListEL!.context(); sp.canvasPanelConfig(); @@ -660,11 +666,11 @@ function moveRangeToCenterAndHighlight(sp: SpSystemTrace, findEntry: any) { sp.timerShaftEL?.drawTriangle(findEntry.startTime || 0, 'inverted'); } -export function SpSystemTraceShowStruct(sp:SpSystemTrace,previous: boolean, currentIndex: number, structs: Array, retargetIndex?: number){ +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 findIndex = spSystemTraceShowStructFindIndex(sp,previous,currentIndex,structs,retargetIndex); let findEntry: any; if (findIndex >= 0) { findEntry = structs[findIndex]; @@ -691,7 +697,7 @@ export function SpSystemTraceShowStruct(sp:SpSystemTrace,previous: boolean, curr moveRangeToCenterAndHighlight(sp, findEntry); return findIndex; } -function SpSystemTraceShowStructFindIndex(sp: SpSystemTrace, previous: boolean, currentIndex: number, structs: Array, retargetIndex: number | undefined) { +function spSystemTraceShowStructFindIndex(sp: SpSystemTrace, previous: boolean, currentIndex: number, structs: Array, retargetIndex: number | undefined) { let findIndex = -1; if (previous) { if (retargetIndex) { @@ -795,7 +801,7 @@ function findEntryTypeSdk(sp: SpSystemTrace, findEntry: any) { sp.closeAllExpandRows(findEntry.rowParentId); sp.scrollToProcess(`${findEntry.rowId}`, `${findEntry.rowParentId}`, findEntry.rowType, true); } -async function SpSystemTraceInitBuffer(sp:SpSystemTrace,param:{buf?:ArrayBuffer;Url?:string},wasmConfigUri:string,progress:Function) { +async function spSystemTraceInitBuffer(sp:SpSystemTrace,param:{buf?:ArrayBuffer;Url?:string},wasmConfigUri:string,progress:Function) { if (param.buf) { let configJson = ''; try { @@ -814,7 +820,7 @@ async function SpSystemTraceInitBuffer(sp:SpSystemTrace,param:{buf?:ArrayBuffer; return null; } } -async function SpSystemTraceInitUrl(sp:SpSystemTrace,param: { buf?: ArrayBuffer; url?: string }, wasmConfigUri: string, progress: Function) { +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) { @@ -826,14 +832,14 @@ async function SpSystemTraceInitUrl(sp:SpSystemTrace,param: { buf?: ArrayBuffer; return null; } } -export async function SpSystemTraceInit(sp:SpSystemTrace,param: { buf?: ArrayBuffer; url?: string }, wasmConfigUri: string, progress: Function) { +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); + let rsBuf = await spSystemTraceInitBuffer(sp,param,wasmConfigUri,progress); if (rsBuf) { return rsBuf; } - let rsUrl = await SpSystemTraceInitUrl(sp,param,wasmConfigUri,progress); + let rsUrl = await spSystemTraceInitUrl(sp,param,wasmConfigUri,progress); if (rsUrl) { return rsUrl; } @@ -954,6 +960,6 @@ const eventMap = { 'hiperf-thread': 'HiPerf Thread', 'js-memory': 'Js Memory', } -export function SpSystemTraceInitPointToEvent(sp: SpSystemTrace) { +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 7f74c98aeb8dae704c3f15d95efa62b4cdc2a42d..02b9f4e1c13ff7dc1183bff555b3aa716d562669 100644 --- a/ide/src/trace/component/SpSystemTrace.line.ts +++ b/ide/src/trace/component/SpSystemTrace.line.ts @@ -421,7 +421,7 @@ function taskAllocationOrPerformTask(sp: SpSystemTrace, row: TraceRow, exec }); } -export function SpSystemTraceDrawTaskPollLine(sp: SpSystemTrace, row?: TraceRow): void { +export function spSystemTraceDrawTaskPollLine(sp: SpSystemTrace, row?: TraceRow): void { let executeID = TabPaneTaskFrames.getExecuteId(FuncStruct.selectFuncStruct!.funName!); TabPaneTaskFrames.TaskArray.push(FuncStruct.selectFuncStruct!); if (!row) { diff --git a/ide/src/trace/component/SpSystemTrace.ts b/ide/src/trace/component/SpSystemTrace.ts index 9afb89926de5307d328bb6c3212675928758d6fc..8114d670297f87f5c817dd4ee90708eb0a0fa9ff 100644 --- a/ide/src/trace/component/SpSystemTrace.ts +++ b/ide/src/trace/component/SpSystemTrace.ts @@ -97,26 +97,28 @@ import { QueryEnum } from '../database/data-trafic/utils/QueryEnum'; import { SpSystemTraceHtml } from './SpSystemTrace.html'; import { querySceneSearchFunc, querySearchFunc } from '../database/sql/Func.sql'; import { queryCpuKeyPathData } from '../database/sql/Cpu.sql'; +import { LtpoStruct } from '../database/ui-worker/ProcedureWorkerLTPO'; +import { HitchTimeStruct } from '../database/ui-worker/ProcedureWorkerHitchTime'; import { - SpSystemTraceInit, - SpSystemTraceInitElement, - SpSystemTraceInitPointToEvent, - SpSystemTraceShowStruct, + spSystemTraceInit, + spSystemTraceInitElement, + spSystemTraceInitPointToEvent, + spSystemTraceShowStruct, } from './SpSystemTrace.init'; import { spSystemTraceDrawJankLine, - SpSystemTraceDrawTaskPollLine, + spSystemTraceDrawTaskPollLine, spSystemTraceDrawThreadLine, } from './SpSystemTrace.line'; -import SpSystemTraceOnClickHandler, { - SpSystemTraceDocumentOnClick, - SpSystemTraceDocumentOnKeyDown, +import spSystemTraceOnClickHandler, { + spSystemTraceDocumentOnClick, + spSystemTraceDocumentOnKeyDown, SpSystemTraceDocumentOnKeyPress, - SpSystemTraceDocumentOnKeyUp, - SpSystemTraceDocumentOnMouseDown, - SpSystemTraceDocumentOnMouseMove, - SpSystemTraceDocumentOnMouseOut, - SpSystemTraceDocumentOnMouseUp, + spSystemTraceDocumentOnKeyUp, + spSystemTraceDocumentOnMouseDown, + spSystemTraceDocumentOnMouseMove, + spSystemTraceDocumentOnMouseOut, + spSystemTraceDocumentOnMouseUp, } from './SpSystemTrace.event'; function dpr(): number { @@ -300,7 +302,7 @@ export class SpSystemTrace extends BaseElement { } initElements(): void { - SpSystemTraceInitElement(this); + spSystemTraceInitElement(this); } // 清除上一次点击调用栈产生的三角旗子 @@ -670,7 +672,7 @@ export class SpSystemTrace extends BaseElement { drawLogsLineSegment(context, this.traceSheetEL?.systemLogFlag, row.frame, this.timerShaftEL!); } - documentOnMouseDown = (ev: MouseEvent): void => SpSystemTraceDocumentOnMouseDown(this, ev); + documentOnMouseDown = (ev: MouseEvent): void => spSystemTraceDocumentOnMouseDown(this, ev); onContextMenuHandler = (e: Event): void => { setTimeout(() => { @@ -683,7 +685,7 @@ export class SpSystemTrace extends BaseElement { }, 100); }; - documentOnMouseUp = (ev: MouseEvent): void => SpSystemTraceDocumentOnMouseUp(this, ev); + documentOnMouseUp = (ev: MouseEvent): void => spSystemTraceDocumentOnMouseUp(this, ev); cancelDrag(): void { this.rangeSelect.drag = false; @@ -696,7 +698,7 @@ export class SpSystemTrace extends BaseElement { }; } - documentOnMouseOut = (ev: MouseEvent) => SpSystemTraceDocumentOnMouseOut(this, ev); + documentOnMouseOut = (ev: MouseEvent) => spSystemTraceDocumentOnMouseOut(this, ev); keyPressMap: Map = new Map([ ['w', false], @@ -706,13 +708,14 @@ export class SpSystemTrace extends BaseElement { ['f', false], ]); - documentOnKeyDown = (ev: KeyboardEvent): void => SpSystemTraceDocumentOnKeyDown(this, ev); + documentOnKeyDown = (ev: KeyboardEvent): void => spSystemTraceDocumentOnKeyDown(this, ev); documentOnKeyPress = (ev: KeyboardEvent): void => SpSystemTraceDocumentOnKeyPress(this, ev); verticalScrollToRow(): void { if (this.currentRow) { - this.currentRow.scrollIntoView({ behavior: 'smooth', block: 'nearest' }); + //@ts-ignore + this.currentRow.scrollIntoViewIfNeeded(); } } @@ -739,6 +742,7 @@ export class SpSystemTrace extends BaseElement { this.currentSlicesTime.endTime = IrqStruct.selectIrqStruct.startNS + IrqStruct.selectIrqStruct.dur; } } else if (TraceRow.rangeSelectObject) { + this.currentRow = undefined; if (TraceRow.rangeSelectObject.startNS && TraceRow.rangeSelectObject.endNS) { this.currentSlicesTime.startTime = TraceRow.rangeSelectObject.startNS; this.currentSlicesTime.endTime = TraceRow.rangeSelectObject.endNS; @@ -755,7 +759,7 @@ export class SpSystemTrace extends BaseElement { } public setSLiceMark = (shiftKey: boolean): SlicesTime | null | undefined => { - const selectedStruct : any = + const selectedStruct: any = CpuStruct.selectCpuStruct || ThreadStruct.selectThreadStruct || FuncStruct.selectFuncStruct || @@ -814,7 +818,7 @@ export class SpSystemTrace extends BaseElement { } }; - documentOnKeyUp = (ev: KeyboardEvent): void => SpSystemTraceDocumentOnKeyUp(this, ev); + documentOnKeyUp = (ev: KeyboardEvent): void => spSystemTraceDocumentOnKeyUp(this, ev); /** * 根据传入的参数实现卡尺和旗子的快捷跳转 @@ -971,7 +975,7 @@ export class SpSystemTrace extends BaseElement { this.rangeSelect.selectHandler?.(this.rangeSelect.rangeTraceRow, false); }; inFavoriteArea: boolean | undefined; - documentOnMouseMove = (ev: MouseEvent): void => SpSystemTraceDocumentOnMouseMove(this, ev); + documentOnMouseMove = (ev: MouseEvent): void => spSystemTraceDocumentOnMouseMove(this, ev); hoverStructNull() { CpuStruct.hoverCpuStruct = undefined; @@ -1030,6 +1034,8 @@ export class SpSystemTrace extends BaseElement { SnapshotStruct.selectSnapshotStruct = undefined; HiPerfCallChartStruct.selectStruct = undefined; AllAppStartupStruct.selectStartupStruct = undefined; + LtpoStruct.selectLtpoStruct = undefined; + HitchTimeStruct.selectHitchTimeStruct = undefined; return this; } @@ -1039,7 +1045,7 @@ export class SpSystemTrace extends BaseElement { ); } - documentOnClick = (ev: MouseEvent) => SpSystemTraceDocumentOnClick(this, ev); + documentOnClick = (ev: MouseEvent) => spSystemTraceDocumentOnClick(this, ev); clickEmptyArea() { this.queryAllTraceRow().forEach((it) => { @@ -1187,7 +1193,7 @@ export class SpSystemTrace extends BaseElement { ]); onClickHandler(clickRowType: string, row?: TraceRow) { - SpSystemTraceOnClickHandler(this, clickRowType, row); + spSystemTraceOnClickHandler(this, clickRowType, row); } makePoint( @@ -1213,7 +1219,7 @@ export class SpSystemTrace extends BaseElement { } drawTaskPollLine(row?: TraceRow) { - SpSystemTraceDrawTaskPollLine(this, row); + spSystemTraceDrawTaskPollLine(this, row); } drawJankLine(endParentRow: any, selectJankStruct: JankStruct, data: any) { spSystemTraceDrawJankLine(this, endParentRow, selectJankStruct, data); @@ -1691,7 +1697,7 @@ export class SpSystemTrace extends BaseElement { } showStruct(previous: boolean, currentIndex: number, structs: Array, retargetIndex?: number) { - return SpSystemTraceShowStruct(this, previous, currentIndex, structs, retargetIndex); + return spSystemTraceShowStruct(this, previous, currentIndex, structs, retargetIndex); } private toTargetDepth = (entry: any, funcRowID: number, funcStract: any) => { @@ -1708,7 +1714,7 @@ export class SpSystemTrace extends BaseElement { scrollToActFunc(funcStract: any, highlight: boolean): void { if (!Utils.isBinder(funcStract)) { - if (funcStract.dur === -1) { + if (funcStract.dur === -1 || funcStract.dur === null || funcStract.dur === undefined) { funcStract.dur = (TraceRow.range?.totalNS || 0) - (funcStract.startTs || 0); funcStract.flag = 'Did not end'; } @@ -1741,6 +1747,7 @@ export class SpSystemTrace extends BaseElement { filterRow.fixedList = [funcStract]; filterRow!.highlight = highlight; let row = this.rowsEL!.querySelector>(`trace-row[row-id='${funcStract.pid}'][folder]`); + this.currentRow = row; if (row && !row.expansion) { row.expansion = true; } @@ -1793,12 +1800,12 @@ export class SpSystemTrace extends BaseElement { it.name = t; it.type = 'thread'; if (next) { - if (it.startTime! + it.dur! > next!.startTime! || it.dur == -1) { + if (it.startTime! + it.dur! > next!.startTime! || it.dur == -1 || it.dur === null || it.dur === undefined) { it.dur = next!.startTime! - it.startTime!; it.nofinish = true; } } else { - if (it.dur == -1) { + if (it.dur == -1 || it.dur === null || it.dur === undefined) { it.dur = TraceRow.range!.endNS - it.startTime!; it.nofinish = true; } @@ -1852,7 +1859,7 @@ export class SpSystemTrace extends BaseElement { } init = async (param: { buf?: ArrayBuffer; url?: string }, wasmConfigUri: string, progress: Function) => { - return SpSystemTraceInit(this, param, wasmConfigUri, progress); + return spSystemTraceInit(this, param, wasmConfigUri, progress); }; extracted(it: TraceRow) { @@ -1935,7 +1942,7 @@ export class SpSystemTrace extends BaseElement { } initPointToEvent(): void { - SpSystemTraceInitPointToEvent(this); + spSystemTraceInitPointToEvent(this); } initHtml(): string { diff --git a/ide/src/trace/component/trace/sheet/cpu/TabPaneCpuByThread.ts b/ide/src/trace/component/trace/sheet/cpu/TabPaneCpuByThread.ts index 679ab4ffdfcf2e904d00b3ee295b32c56de4f3e9..5c07ba2faf0586382b97be1747c48661f98637d2 100644 --- a/ide/src/trace/component/trace/sheet/cpu/TabPaneCpuByThread.ts +++ b/ide/src/trace/component/trace/sheet/cpu/TabPaneCpuByThread.ts @@ -20,7 +20,7 @@ import { log } from '../../../../../log/Log'; import { getProbablyTime } from '../../../../database/logic-worker/ProcedureLogicWorkerCommon'; import { Utils } from '../../base/Utils'; import { resizeObserver } from '../SheetUtils'; -import { getTabCpuByThread } from "../../../../database/sql/Cpu.sql"; +import { getTabCpuByThread } from '../../../../database/sql/Cpu.sql'; @element('tabpane-cpu-thread') export class TabPaneCpuByThread extends BaseElement { @@ -204,40 +204,38 @@ export class TabPaneCpuByThread extends BaseElement { `; } - - sortByColumn(detail: any) { - // @ts-ignore - function compare(property, sort, type) { - return function (cpuByThreadLeftData: SelectionData, cpuByThreadRightData: SelectionData) { - if (cpuByThreadLeftData.process == ' ' || cpuByThreadRightData.process == ' ') { - return 0; - } - if (type === 'number') { - return sort === 2 - ? // @ts-ignore + compare(property: any, sort: any, type: string) { + return function (cpuByThreadLeftData: SelectionData, cpuByThreadRightData: SelectionData) { + if (cpuByThreadLeftData.process == ' ' || cpuByThreadRightData.process == ' ') { + return 0; + } + if (type === 'number') { + return sort === 2 + ? // @ts-ignore parseFloat(cpuByThreadRightData[property]) - parseFloat(cpuByThreadLeftData[property]) - : // @ts-ignore + : // @ts-ignore parseFloat(cpuByThreadLeftData[property]) - parseFloat(cpuByThreadRightData[property]); + } else { + // @ts-ignore + if (cpuByThreadRightData[property] > cpuByThreadLeftData[property]) { + return sort === 2 ? 1 : -1; } else { // @ts-ignore - if (cpuByThreadRightData[property] > cpuByThreadLeftData[property]) { - return sort === 2 ? 1 : -1; + if (cpuByThreadRightData[property] == cpuByThreadLeftData[property]) { + return 0; } else { - // @ts-ignore - if (cpuByThreadRightData[property] == cpuByThreadLeftData[property]) { - return 0; - } else { - return sort === 2 ? -1 : 1; - } + return sort === 2 ? -1 : 1; } } - }; - } + } + }; + } + sortByColumn(detail: any) { if ((detail.key as string).includes('cpu')) { if ((detail.key as string).includes('Ratio')) { - this.cpuByThreadSource.sort(compare(detail.key, detail.sort, 'string')); + this.cpuByThreadSource.sort(this.compare(detail.key, detail.sort, 'string')); } else { - this.cpuByThreadSource.sort(compare((detail.key as string).replace('TimeStr', ''), detail.sort, 'number')); + this.cpuByThreadSource.sort(this.compare((detail.key as string).replace('TimeStr', ''), detail.sort, 'number')); } } else { if ( @@ -247,9 +245,9 @@ export class TabPaneCpuByThread extends BaseElement { detail.key === 'avgDuration' || detail.key === 'occurrences' ) { - this.cpuByThreadSource.sort(compare(detail.key, detail.sort, 'number')); + this.cpuByThreadSource.sort(this.compare(detail.key, detail.sort, 'number')); } else { - this.cpuByThreadSource.sort(compare(detail.key, detail.sort, 'string')); + this.cpuByThreadSource.sort(this.compare(detail.key, detail.sort, 'string')); } }