1/* 2 * Copyright (C) 2022 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use sp file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16import { JankStruct } from '../database/ui-worker/ProcedureWorkerJank'; 17import { SpSystemTrace } from './SpSystemTrace'; 18import { TraceRow } from './trace/base/TraceRow'; 19import { LineType, PairPoint, ns2xByTimeShaft } from '../database/ui-worker/ProcedureWorkerCommon'; 20import { TabPaneTaskFrames } from './trace/sheet/task/TabPaneTaskFrames'; 21import { FuncStruct } from '../database/ui-worker/ProcedureWorkerFunc'; 22import { queryBySelectExecute } from '../database/sql/ProcessThread.sql'; 23import { queryTaskPoolOtherRelationData, queryTaskPoolRelationData } from '../database/sql/Func.sql'; 24import { queryBySelectAllocationOrReturn } from '../database/sql/SqlLite.sql'; 25import { ThreadStruct } from '../database/ui-worker/ProcedureWorkerThread'; 26import { Utils } from './trace/base/Utils'; 27import { TraceMode } from '../SpApplicationPublicFunc'; 28import { BaseStruct } from '../bean/BaseStruct'; 29import { getTimeString } from './trace/sheet/TabPaneCurrentSelection'; 30 31//@ts-ignore 32function collectionHasJank(jankRow: unknown, collectList: TraceRow<unknown>[]): boolean { 33 for (let item of collectList!) { 34 //@ts-ignore 35 if (item.rowId === jankRow.rowId && item.rowType === jankRow.rowType) { 36 return false; 37 } 38 } 39 return true; 40} 41 42function setPoint( 43 x: number, 44 y: number, 45 offsetY: number, 46 ns: number, 47 rowEL: unknown, 48 isRight: boolean, 49 business: string 50): PairPoint { 51 return { 52 x: x, 53 y: y, 54 offsetY: offsetY, 55 ns: ns, 56 rowEL: rowEL!, 57 isRight: isRight, 58 business: business, 59 } as PairPoint; 60} 61 62function addPointHandle( 63 sp: SpSystemTrace, 64 sourceData: FuncStruct, 65 sourceThreadRow: TraceRow<BaseStruct>, 66 targetData: FuncStruct, 67 targetThreadRow: TraceRow<BaseStruct>, 68 lineType?: string 69): void { 70 let sourceParentRow: TraceRow<BaseStruct> | null | undefined; 71 let targetParentRow: TraceRow<BaseStruct> | null | undefined; 72 if (Utils.currentTraceMode === TraceMode.DISTRIBUTED) { 73 sourceParentRow = sp.shadowRoot?.querySelector<TraceRow<BaseStruct>>( 74 `trace-row[row-id='${sourceData.pid}-${sourceData.traceId}'][row-type='process'][folder]` 75 ); 76 targetParentRow = sp.shadowRoot?.querySelector<TraceRow<BaseStruct>>( 77 `trace-row[row-id='${targetData.pid}-${targetData.traceId}'][row-type='process'][folder]` 78 ); 79 } else { 80 sourceParentRow = sp.shadowRoot?.querySelector<TraceRow<BaseStruct>>( 81 `trace-row[row-id='${sourceData.pid}'][row-type='process'][folder]` 82 ); 83 targetParentRow = sp.shadowRoot?.querySelector<TraceRow<BaseStruct>>( 84 `trace-row[row-id='${targetData.pid}'][row-type='process'][folder]` 85 ); 86 } 87 let [startY, startOffSetY, startRowEl, isThreadRow] = 88 getPointModel(sp, sourceThreadRow, sourceParentRow, sourceData, 0.9); 89 let [endY, endOffSetY, endRowEl] = 90 getPointModel(sp, targetThreadRow, targetParentRow, targetData, 0.1); 91 let startX = Math.floor(ns2xByTimeShaft(sourceData.ts || sourceData.startTs || 0, sp.timerShaftEL!)); 92 let endX = Math.floor(ns2xByTimeShaft(targetData.ts! || targetData.startTs!, sp.timerShaftEL!)); 93 const startPoint = setPoint(startX, startY, startOffSetY, sourceData.ts || sourceData.startTs || 0, startRowEl, true, 'distributed'); 94 const endPoint = setPoint(endX, endY, endOffSetY, targetData.ts! || targetData.startTs!, endRowEl, true, 'distributed'); 95 startPoint.rangeTime = `${getTimeString((targetData.ts || targetData.startTs! || 0) - (sourceData.ts || sourceData.startTs || 0))}`; 96 if (startPoint && endPoint) { 97 startPoint.lineType = endPoint.lineType = LineType.brokenLine; 98 startPoint.lineColor = endPoint.lineColor = '#ff0000'; 99 sp.addPointPair(startPoint, endPoint, lineType); 100 } 101} 102 103function getPointModel( 104 sp: SpSystemTrace, 105 threadRow: TraceRow<BaseStruct> | null | undefined, 106 parentRow: TraceRow<BaseStruct> | null | undefined, 107 dataStruct: FuncStruct, 108 pointYHeight: number, 109): [number, number, TraceRow<BaseStruct>, boolean] { 110 let pointY: number = 0; 111 let isThreadRow = false; 112 let pointRowEl: TraceRow<BaseStruct> | null | undefined; 113 let pointOffSetY: number = 0; 114 if (threadRow) { 115 pointY = threadRow?.translateY + 20 * (dataStruct.depth! + pointYHeight); 116 pointRowEl = threadRow; 117 pointOffSetY = 20 * (dataStruct.depth! + pointYHeight); 118 isThreadRow = true; 119 } else if (parentRow) { 120 if (!parentRow.expansion) { 121 pointY = parentRow?.translateY! + 4 * (dataStruct.depth! + 0.5); 122 pointRowEl = parentRow!; 123 pointOffSetY = 4 * (dataStruct.depth! + 0.5); 124 } 125 } else { 126 pointRowEl = sp.shadowRoot?.querySelector<TraceRow<BaseStruct>>( 127 `trace-row[row-id='trace-${dataStruct.traceId}'][row-type='trace-${dataStruct.traceId}'][folder]` 128 ); 129 pointY = pointRowEl?.translateY! + 4 * (dataStruct.depth! + 0.5); 130 pointOffSetY = 4 * (dataStruct.depth! + 0.5); 131 } 132 return [pointY, pointOffSetY, pointRowEl!, isThreadRow]; 133} 134 135function selectJankApp( 136 endParentRow: unknown, 137 sp: SpSystemTrace, 138 data: unknown, 139 startRow: unknown, 140 selectJankStruct: JankStruct, 141 endRowStruct: unknown 142): void { 143 let collectList = sp.favoriteChartListEL!.getAllCollectRows(); 144 //@ts-ignore 145 let findJankEntry = endRowStruct!.dataListCache!.find( 146 //@ts-ignore 147 (dat: unknown) => `${dat.name}` === `${data.name}` && `${dat.pid}` === `${data.pid}` 148 ); 149 let tts = 150 findJankEntry.frameType === 'frameTime' ? selectJankStruct.ts! : selectJankStruct.ts! + selectJankStruct.dur!; 151 let startParentRow: unknown; 152 // startRow为子泳道,子泳道不存在,使用父泳道 153 if (startRow) { 154 startParentRow = sp.shadowRoot?.querySelector<TraceRow<JankStruct>>( 155 //@ts-ignore 156 `trace-row[row-type='process'][row-id='${startRow.rowParentId}'][folder]` 157 ); 158 } else { 159 startRow = sp.shadowRoot?.querySelector<TraceRow<JankStruct>>( 160 `trace-row[row-type='process'][row-id='${selectJankStruct?.pid}'][folder]` 161 ); 162 } 163 //@ts-ignore 164 let endY = endRowStruct!.translateY! + 20 * (findJankEntry!.depth! + 0.5); 165 let endRowEl = endRowStruct; 166 let endOffSetY = 20 * (findJankEntry!.depth! + 0.5); 167 let expansionFlag = collectionHasJank(endRowStruct, collectList); 168 //@ts-ignore 169 if (!endParentRow.expansion && expansionFlag) { 170 //@ts-ignore 171 endY = endParentRow!.translateY! + 10 * (findJankEntry!.depth! + 0.5); 172 endRowEl = endParentRow; 173 endOffSetY = 10 * (findJankEntry!.depth! + 0.5); 174 } 175 // 应用泳道折叠 176 //@ts-ignore 177 let startY = startRow!.translateY! + 10 * (selectJankStruct!.depth! + 0.5); 178 let startRowEl = startRow; 179 let startOffSetY = 10 * (selectJankStruct!.depth! + 0.5); 180 expansionFlag = collectionHasJank(startRow, collectList); 181 // 应用泳道展开 或者ActualTime 已收藏 182 //@ts-ignore 183 if ((startParentRow && startParentRow.expansion) || !expansionFlag) { 184 //@ts-ignore 185 startY = startRowEl!.translateY! + 20 * (selectJankStruct!.depth! + 0.5); 186 startOffSetY = 20 * (selectJankStruct!.depth! + 0.5); 187 } 188 let startX = ns2xByTimeShaft(tts, sp.timerShaftEL!); 189 let endX = ns2xByTimeShaft(findJankEntry.ts!, sp.timerShaftEL!); 190 const startPoint = setPoint(startX, startY, startOffSetY, tts, startRowEl, selectJankStruct.ts === tts, 'janks'); 191 const endPoint = setPoint(endX, endY, endOffSetY, findJankEntry.ts!, endRowEl, true, 'janks'); 192 //@ts-ignore 193 sp.addPointPair(startPoint, endPoint); 194} 195 196function findJankApp( 197 endParentRow: unknown, 198 sp: SpSystemTrace, 199 data: unknown, 200 startRow: unknown, 201 selectJankStruct: JankStruct, 202 endRowStruct: unknown 203): void { 204 let collectList = sp.favoriteChartListEL!.getAllCollectRows(); 205 //@ts-ignore 206 let findJankEntry = endRowStruct!.dataListCache!.find( 207 //@ts-ignore 208 (dat: unknown) => dat.name === data.name && dat.pid === data.pid 209 ); 210 let tts = selectJankStruct.frameType === 'frameTime' ? findJankEntry.ts : findJankEntry.ts! + findJankEntry.dur!; 211 //@ts-ignore 212 let endY = endRowStruct!.translateY! + 20 * (findJankEntry!.depth! + 0.5); 213 let endRowEl = endRowStruct; 214 let endOffSetY = 20 * (findJankEntry!.depth! + 0.5); 215 let expansionFlag = collectionHasJank(endRowStruct, collectList); 216 //@ts-ignore 217 if (!endParentRow.expansion && expansionFlag) { 218 //@ts-ignore 219 endY = endParentRow!.translateY! + 5 * (findJankEntry!.depth! + 0.5); 220 endRowEl = endParentRow; 221 endOffSetY = 10 * (findJankEntry!.depth! + 0.5); 222 } 223 //@ts-ignore 224 let startY = startRow!.translateY! + 20 * (selectJankStruct!.depth! + 0.5); 225 let startRowEl = startRow; 226 expansionFlag = collectionHasJank(startRow, collectList); 227 let startOffsetY = 20 * (selectJankStruct!.depth! + 0.5); 228 let startParentRow = sp.shadowRoot?.querySelector<TraceRow<JankStruct>>( 229 //@ts-ignore 230 `trace-row[row-type='process'][row-id='${startRow.rowParentId}'][folder]` 231 ); 232 if (startParentRow && !startParentRow.expansion && expansionFlag) { 233 startY = startParentRow!.translateY! + 10 * (selectJankStruct!.depth! + 0.5); 234 startRowEl = startParentRow; 235 startOffsetY = 10 * (selectJankStruct!.depth! + 0.5); 236 } 237 let startX = ns2xByTimeShaft(selectJankStruct.ts!, sp.timerShaftEL!); 238 let endX = ns2xByTimeShaft(tts, sp.timerShaftEL!); 239 const startPoint = setPoint(startX, startY, startOffsetY, selectJankStruct.ts!, startRowEl, true, 'janks'); 240 const endPoint = setPoint(endX, endY, endOffSetY, tts, endRowEl, selectJankStruct.ts === tts, 'janks'); 241 //@ts-ignore 242 sp.addPointPair(startPoint, endPoint); 243} 244 245function addPointLink( 246 endParentRow: unknown, 247 sp: SpSystemTrace, 248 data: unknown, 249 startRow: unknown, 250 selectJankStruct: JankStruct, 251 endRowStruct: unknown 252): void { 253 //@ts-ignore 254 let findJankEntry = endRowStruct!.dataListCache!.find( 255 //@ts-ignore 256 (dat: unknown) => dat.name === data.name && dat.pid === data.pid 257 ); 258 //连线规则:frametimeline的头----app的头,app的尾----renderservice的头 259 let tts: number = 0; 260 if (findJankEntry) { 261 if (selectJankStruct.frameType === 'app') { 262 selectJankApp(endParentRow, sp, data, startRow, selectJankStruct, endRowStruct); 263 } 264 if (findJankEntry.frameType === 'app') { 265 //@ts-ignore 266 findJankApp(endParentRow, sp, data, startRow, selectJankStruct, endRowStruct); 267 } 268 //@ts-ignore 269 if (data.children.length >= 1) { 270 let endP; 271 //@ts-ignore 272 if (data.children[0].frameType === 'frameTime') { 273 //@ts-ignore 274 endP = sp.shadowRoot?.querySelector<TraceRow<unknown>>(`trace-row[row-type='janks'][row-id='frameTime']`); 275 } else { 276 //@ts-ignore 277 endP = sp.shadowRoot?.querySelector<TraceRow<unknown>>( 278 //@ts-ignore 279 `trace-row[row-type='process'][row-id='${data.children[0].pid}'][folder]` 280 ); 281 } 282 //@ts-ignore 283 sp.drawJankLine(endP, findJankEntry, data.children[0]); 284 } 285 } 286} 287 288function getEndStruct(data: unknown, sp: SpSystemTrace): unknown { 289 let endRowStruct: unknown; 290 //@ts-ignore 291 if (data.frameType === 'frameTime') { 292 endRowStruct = sp.shadowRoot?.querySelector<TraceRow<JankStruct>>( 293 "trace-row[row-id='actual frameTime'][row-type='janks']" 294 ); 295 } else { 296 endRowStruct = sp.shadowRoot?.querySelector<TraceRow<JankStruct>>( 297 //@ts-ignore 298 `trace-row[row-id='${data.type}-${data.pid}'][row-type='janks']` 299 ); 300 } 301 return endRowStruct; 302} 303 304function drawJankLineEndParent( 305 endParentRow: unknown, 306 sp: SpSystemTrace, 307 data: unknown, 308 startRow: unknown, 309 selectJankStruct: JankStruct, 310 isBinderClick: boolean = false 311): void { 312 if (isBinderClick) { 313 //@ts-ignore 314 endParentRow.expansion = true; 315 } 316 //终点的父泳道过滤出选中的Struct 317 let endRowStruct = getEndStruct(data, sp); 318 //泳道未展开的情况,查找endRowStruct 319 if (!endRowStruct) { 320 //@ts-ignore 321 if (data.frameType === 'frameTime') { 322 //@ts-ignore 323 endParentRow.childrenList.forEach((item: TraceRow<JankStruct>) => { 324 if (item.rowId === 'actual frameTime' && item.rowType === 'janks') { 325 endRowStruct = item; 326 } 327 }); 328 //frameTime未展开 329 if (!endRowStruct) { 330 endParentRow = sp.shadowRoot?.querySelector<TraceRow<JankStruct>>("trace-row[row-id='frameTime'][folder]"); 331 //@ts-ignore 332 endParentRow?.childrenList?.forEach((item: TraceRow<JankStruct>): void => { 333 if (item.rowId === 'actual frameTime' && item.rowType === 'janks') { 334 endRowStruct = item; 335 } 336 }); 337 } 338 } else { 339 //@ts-ignore 340 endParentRow.childrenList.forEach((item: TraceRow<JankStruct>) => { 341 if (item.name.startsWith('Actual Timeline') && item.rowType === 'janks') { 342 endRowStruct = item; 343 } 344 }); 345 } 346 } 347 if (endRowStruct) { 348 //@ts-ignore 349 if (endRowStruct.isComplete) { 350 addPointLink(endParentRow, sp, data, startRow, selectJankStruct, endRowStruct); 351 } else { 352 //@ts-ignore 353 endRowStruct.supplierFrame!().then((res: unknown) => { 354 //@ts-ignore 355 endRowStruct.dataListCache = res; 356 //@ts-ignore 357 endRowStruct.loadingFrame = false; 358 addPointLink(endParentRow, sp, data, startRow, selectJankStruct, endRowStruct); 359 }); 360 } 361 } 362} 363 364export function spSystemTraceDrawJankLine( 365 sp: SpSystemTrace, 366 endParentRow: unknown, 367 selectJankStruct: JankStruct, 368 data: unknown, 369 isBinderClick: boolean = false 370): void { 371 let collectList = sp.favoriteChartListEL!.getAllCollectRows(); 372 let startRow: unknown; 373 if (!selectJankStruct) { 374 return; 375 } 376 let selectRowId = 'actual frameTime'; 377 if (selectJankStruct.frameType === 'frameTime') { 378 startRow = sp.shadowRoot?.querySelector<TraceRow<JankStruct>>( 379 `trace-row[row-id='${selectRowId}'][row-type='janks']` 380 ); 381 } else { 382 selectRowId = `${selectJankStruct.type}-${selectJankStruct.pid}`; 383 startRow = sp.shadowRoot?.querySelector<TraceRow<JankStruct>>( 384 `trace-row[row-id='${selectRowId}'][row-type='janks']` 385 ); 386 } 387 if (!startRow) { 388 for (let collectChart of collectList) { 389 if (collectChart.rowId === selectRowId && collectChart.rowType === 'janks') { 390 startRow = collectChart; 391 break; 392 } 393 } 394 } 395 if (endParentRow) { 396 drawJankLineEndParent(endParentRow, sp, data, startRow, selectJankStruct, isBinderClick); 397 } 398} 399 400export function spSystemTraceDrawDistributedLine( 401 sp: SpSystemTrace, 402 sourceData: FuncStruct, 403 targetData: FuncStruct, 404 selectFuncStruct: FuncStruct, 405): void { 406 let collectList = sp.favoriteChartListEL!.getAllCollectRows() as TraceRow<BaseStruct>[]; 407 if (!selectFuncStruct) { 408 return; 409 } 410 let sourceThreadRow; 411 let targetThreadRow; 412 let sourceRowId; 413 let targetRowId; 414 if (Utils.currentTraceMode === TraceMode.DISTRIBUTED) { 415 sourceRowId = `${sourceData.tid}-${sourceData.traceId}`; 416 targetRowId = `${targetData.tid}-${targetData.traceId}`; 417 sourceThreadRow = sp.shadowRoot?.querySelector( 418 `trace-row[row-id='${sourceRowId}'][row-type='func']` 419 ) as TraceRow<BaseStruct>; 420 targetThreadRow = sp.shadowRoot?.querySelector( 421 `trace-row[row-id='${targetRowId}'][row-type='func']` 422 ) as TraceRow<BaseStruct>; 423 } else { 424 sourceRowId = `${sourceData.tid}`; 425 targetRowId = `${targetData.tid}`; 426 sourceThreadRow = sp.shadowRoot?.querySelector( 427 `trace-row[row-id='${sourceData.tid}'][row-type='func']` 428 ) as TraceRow<BaseStruct>; 429 targetThreadRow = sp.shadowRoot?.querySelector( 430 `trace-row[row-id='${targetData.tid}'][row-type='func']` 431 ) as TraceRow<BaseStruct>; 432 } 433 if (!sourceThreadRow || !targetThreadRow) { 434 for (let collectChart of collectList) { 435 if ( 436 !sourceThreadRow && 437 (Utils.currentTraceMode !== TraceMode.DISTRIBUTED || collectChart.traceId === sourceData.traceId) && 438 collectChart.rowId === sourceRowId && 439 collectChart.rowType === 'func' 440 ) { 441 sourceThreadRow = collectChart; 442 } 443 if ( 444 !targetThreadRow && 445 (Utils.currentTraceMode !== TraceMode.DISTRIBUTED || collectChart.traceId === targetData.traceId) && 446 collectChart.rowId === targetRowId && 447 collectChart.rowType === 'func' 448 ) { 449 targetThreadRow = collectChart; 450 } 451 } 452 } 453 addPointHandle(sp, sourceData, sourceThreadRow, targetData, targetThreadRow, 'distributedLine'); 454} 455 456function taskPoolOtherRelationData( 457 selectRow: unknown, 458 sp: SpSystemTrace, 459 //@ts-ignore 460 row: TraceRow<unknown>, 461 relationDataList: FuncStruct[], 462 res: unknown 463): void { 464 sp.clearPointPair(); 465 //@ts-ignore 466 selectRow!.fixedList = relationDataList; 467 if (FuncStruct.selectFuncStruct === undefined || FuncStruct.selectFuncStruct === null) { 468 return; 469 } 470 relationDataList.forEach((value) => { 471 TabPaneTaskFrames.TaskArray.push(value); 472 // allocation to execute 473 const selectY = (FuncStruct.selectFuncStruct!.depth! + 0.5) * 20; 474 const offSetY = (value.depth! + 0.5) * 20; 475 //@ts-ignore 476 const selectRowY = selectRow?.translateY!; 477 const selectStartTs = FuncStruct.selectFuncStruct!.startTs!; 478 const selectDur = FuncStruct.selectFuncStruct!.dur!; 479 //@ts-ignore 480 if (value.id === res[0].allocation_task_row) { 481 sp.addPointPair( 482 sp.makePoint(value.startTs!, 0, selectRowY, selectRow, offSetY, 'task', LineType.bezierCurve, true), 483 sp.makePoint(selectStartTs, 0, row?.translateY!, row, selectY, 'task', LineType.bezierCurve, true) 484 ); 485 } else { 486 sp.addPointPair( 487 sp.makePoint(selectStartTs, selectDur, row?.translateY!, row, selectY, 'task', LineType.bezierCurve, false), 488 sp.makePoint(value.startTs!, value.dur!, selectRowY, selectRow, offSetY, 'task', LineType.bezierCurve, false) 489 ); 490 } 491 }); 492 sp.refreshCanvas(true); 493} 494 495function taskPoolRelationDataAllocation( 496 executeRow: TraceRow<FuncStruct> | null | undefined, 497 sp: SpSystemTrace, 498 //@ts-ignore 499 row: TraceRow<unknown>, 500 relationDataList: FuncStruct[], 501 res: unknown 502): void { 503 sp.clearPointPair(); 504 if (FuncStruct.selectFuncStruct === undefined || FuncStruct.selectFuncStruct === null) { 505 return; 506 } 507 //@ts-ignore 508 let executeStruct = relationDataList.filter((item) => item.id === res[0].execute_task_row)[0]; 509 relationDataList.forEach((value) => { 510 const selectY = (FuncStruct.selectFuncStruct!.depth! + 0.5) * 20; 511 const offSetY = (value.depth! + 0.5) * 20; 512 const executeRowY = executeRow?.translateY!; 513 const selectStartTs = FuncStruct.selectFuncStruct!.startTs!; 514 const executeY = (executeStruct.depth! + 0.5) * 20; 515 TabPaneTaskFrames.TaskArray.push(value); 516 //@ts-ignore 517 if (value.id === res[0].execute_task_row) { 518 sp.addPointPair( 519 sp.makePoint(selectStartTs, 0, row?.translateY!, row, selectY, 'task', LineType.bezierCurve, true), 520 sp.makePoint(value.startTs!, 0, executeRowY, executeRow, offSetY, 'task', LineType.bezierCurve, true) 521 ); 522 } else { 523 sp.addPointPair( 524 sp.makePoint( 525 executeStruct.startTs!, 526 executeStruct.dur!, 527 executeRowY, 528 executeRow, 529 executeY, 530 'task', 531 LineType.bezierCurve, 532 false 533 ), 534 sp.makePoint(value.startTs!, value.dur!, row?.translateY!, row, offSetY, 'task', LineType.bezierCurve, false) 535 ); 536 } 537 }); 538} 539 540function taskPoolRelationDataPerformTask( 541 executeRow: TraceRow<FuncStruct> | null | undefined, 542 sp: SpSystemTrace, 543 //@ts-ignore 544 row: TraceRow<unknown>, 545 relationDataList: FuncStruct[], 546 res: unknown 547): void { 548 sp.clearPointPair(); 549 if (FuncStruct.selectFuncStruct === undefined || FuncStruct.selectFuncStruct === null) { 550 return; 551 } 552 //@ts-ignore 553 let executeStruct = relationDataList.filter((item) => item.id === res[0].execute_task_row)[0]; 554 relationDataList.forEach((value) => { 555 const executeRowY = executeRow?.translateY!; 556 const selectStartTs = FuncStruct.selectFuncStruct!.startTs!; 557 const executeY = (executeStruct.depth! + 0.5) * 20; 558 const selectY = (FuncStruct.selectFuncStruct!.depth! + 0.5) * 20; 559 const offSetY = (value.depth! + 0.5) * 20; 560 TabPaneTaskFrames.TaskArray.push(value); 561 //@ts-ignore 562 if (value.id === res[0].execute_task_row) { 563 sp.addPointPair( 564 sp.makePoint( 565 selectStartTs, 566 FuncStruct.selectFuncStruct!.dur!, 567 row?.translateY!, 568 row, 569 selectY, 570 'task', 571 LineType.bezierCurve, 572 false 573 ), 574 sp.makePoint(value.startTs!, value.dur!, executeRowY, executeRow, offSetY, 'task', LineType.bezierCurve, false) 575 ); 576 } else { 577 sp.addPointPair( 578 sp.makePoint(executeStruct.startTs!, 0, executeRowY, executeRow, executeY, 'task', LineType.bezierCurve, true), 579 sp.makePoint(value.startTs!, 0, row?.translateY!, row, offSetY, 'task', LineType.bezierCurve, true) 580 ); 581 } 582 }); 583 sp.refreshCanvas(true); 584} 585 586//@ts-ignore 587function taskAllocationOrPerformTask(sp: SpSystemTrace, row: TraceRow<unknown>, executeID: string): void { 588 TabPaneTaskFrames.IsShowConcurrency = false; 589 sp.clearPointPair(); 590 queryBySelectAllocationOrReturn(executeID, FuncStruct.selectFuncStruct!.itid!).then((res) => { 591 if (!FuncStruct.selectFuncStruct) { 592 return; 593 } 594 if (FuncStruct.selectFuncStruct!.funName!.indexOf('H:Task Allocation:') >= 0 && res.length > 0) { 595 let executeRow = sp.shadowRoot?.querySelector<TraceRow<FuncStruct>>( 596 `trace-row[row-id='${res[0].tid}'][row-type='func']` 597 ); 598 if (!executeRow) { 599 return; 600 } 601 let idList: number[] = []; 602 let tidList: number[] = []; 603 if (res[0].execute_task_row) { 604 idList.push(res[0].execute_task_row); 605 tidList.push(Number(res[0].tid)); 606 } 607 if (res[0].return_task_row) { 608 idList.push(res[0].return_task_row); 609 tidList.push(Number(row.rowId)); 610 } 611 queryTaskPoolRelationData(idList, tidList).then((relationDataList) => { 612 taskPoolRelationDataAllocation(executeRow, sp, row, relationDataList, res); 613 }); 614 } else if (FuncStruct.selectFuncStruct!.funName!.indexOf('H:Task PerformTask End:') >= 0) { 615 let executeRow = sp.shadowRoot?.querySelector<TraceRow<FuncStruct>>( 616 `trace-row[row-id='${res[0].tid}'][row-type='func']` 617 ); 618 TabPaneTaskFrames.TaskArray.push(FuncStruct.selectFuncStruct!); 619 let idList: number[] = []; 620 let tidList: number[] = []; 621 if (res[0].execute_task_row) { 622 idList.push(res[0].execute_task_row); 623 tidList.push(Number(res[0].tid)); 624 } 625 if (res[0].allocation_task_row) { 626 idList.push(res[0].allocation_task_row); 627 tidList.push(Number(row.rowId)); 628 } 629 queryTaskPoolRelationData(idList, tidList).then((relationDataList) => { 630 taskPoolRelationDataPerformTask(executeRow, sp, row, relationDataList, res); 631 }); 632 } 633 }); 634} 635 636//@ts-ignore 637export function spSystemTraceDrawTaskPollLine(sp: SpSystemTrace, row?: TraceRow<unknown>): void { 638 if (FuncStruct.selectFuncStruct === undefined || FuncStruct.selectFuncStruct === null) { 639 return; 640 } 641 let relationId = TabPaneTaskFrames.getRelationId(FuncStruct.selectFuncStruct!.funName!); 642 TabPaneTaskFrames.TaskArray.push(FuncStruct.selectFuncStruct!); 643 if (!row) { 644 return; 645 } 646 if (FuncStruct.selectFuncStruct!.funName!.indexOf('H:Task Perform:') >= 0) { 647 TabPaneTaskFrames.IsShowConcurrency = true; 648 queryBySelectExecute(relationId, FuncStruct.selectFuncStruct!.itid!).then((res) => { 649 if (res.length === 1) { 650 let allocationRowId = res[0].tid; 651 let selectRow = sp.shadowRoot?.querySelector<TraceRow<FuncStruct>>( 652 `trace-row[row-id='${allocationRowId}'][row-type='func']` 653 ); 654 if (!selectRow) { 655 let collectList = sp.favoriteChartListEL!.getAllCollectRows(); 656 for (let selectCollectRow of collectList) { 657 if (selectCollectRow.rowId === allocationRowId.toString() && selectCollectRow.rowType === 'func') { 658 // @ts-ignore 659 selectRow = selectCollectRow; 660 break; 661 } 662 } 663 } 664 let idList: number[] = []; 665 if (res[0].allocation_task_row) { 666 idList.push(res[0].allocation_task_row); 667 } 668 if (res[0].return_task_row) { 669 idList.push(res[0].return_task_row); 670 } 671 queryTaskPoolOtherRelationData(idList, allocationRowId).then((relationDataList) => { 672 taskPoolOtherRelationData(selectRow, sp, row, relationDataList, res); 673 }); 674 } 675 }); 676 } else { 677 taskAllocationOrPerformTask(sp, row, relationId); 678 } 679} 680 681function jankPoint( 682 endRowStruct: unknown, 683 selectThreadStruct: ThreadStruct, 684 startRow: unknown, 685 endParentRow: unknown, 686 sp: SpSystemTrace 687): void { 688 //@ts-ignore 689 let findJankEntry = endRowStruct!.fixedList[0]; 690 let ts: number = 0; 691 if (findJankEntry) { 692 ts = selectThreadStruct.startTime! + selectThreadStruct.dur! / 2; 693 const [startY, startRowEl, startOffSetY] = sp.calculateStartY(startRow, selectThreadStruct.pid, selectThreadStruct.tid); 694 const [endY, endRowEl, endOffSetY] = sp.calculateEndY(endParentRow, endRowStruct); 695 sp.addPointPair( 696 sp.makePoint( 697 ns2xByTimeShaft(ts, sp.timerShaftEL!), 698 ts, 699 startY, 700 startRowEl!, 701 startOffSetY, 702 'thread', 703 LineType.straightLine, 704 selectThreadStruct.startTime === ts 705 ), 706 sp.makePoint( 707 ns2xByTimeShaft(findJankEntry.startTime!, sp.timerShaftEL!), 708 findJankEntry.startTime!, 709 endY, 710 endRowEl, 711 endOffSetY, 712 'thread', 713 LineType.straightLine, 714 true 715 ) 716 ); 717 } 718} 719 720function junkBinder( 721 endRowStruct: unknown, 722 selectFuncStruct: FuncStruct, 723 startRow: unknown, 724 endParentRow: unknown, 725 sp: SpSystemTrace, 726 data: unknown 727): void { 728 // @ts-ignore 729 let findJankEntry = endRowStruct!.fixedList[0]; 730 let ts: number = 0; 731 if (findJankEntry) { 732 ts = selectFuncStruct.startTs! + selectFuncStruct.dur! / 2; 733 const [startY, startRowEl, startOffSetY] = sp.calculateStartY(startRow, selectFuncStruct.pid, selectFuncStruct.tid, selectFuncStruct); 734 const [endY, endRowEl, endOffSetY] = sp.calculateEndY(endParentRow, endRowStruct, data); 735 sp.addPointPair( 736 sp.makePoint( 737 ns2xByTimeShaft(ts, sp.timerShaftEL!), 738 ts, 739 startY, 740 startRowEl!, 741 startOffSetY, 742 'func', 743 LineType.straightLine, 744 selectFuncStruct.startTs === ts 745 ), 746 sp.makePoint( 747 ns2xByTimeShaft(findJankEntry.startTs!, sp.timerShaftEL!), 748 findJankEntry.startTs!, 749 endY, 750 endRowEl, 751 endOffSetY, 752 'func', 753 LineType.straightLine, 754 true 755 ) 756 ); 757 } 758} 759 760export function spSystemTraceDrawThreadLine( 761 sp: SpSystemTrace, 762 endParentRow: unknown, 763 selectThreadStruct: ThreadStruct | undefined, 764 data: unknown 765): void { 766 let collectList = sp.favoriteChartListEL!.getCollectRows(); 767 if (!selectThreadStruct) { 768 return; 769 } 770 let selectRowId = selectThreadStruct.tid; 771 let selectRowPid = selectThreadStruct.pid; 772 let startRow = sp.getStartRow(selectRowId, selectRowPid, collectList); 773 774 if (endParentRow) { 775 //@ts-ignore 776 endParentRow.expansion = true; 777 let endRowStruct: unknown = sp.shadowRoot?.querySelector<TraceRow<ThreadStruct>>( 778 //@ts-ignore 779 `trace-row[row-id='${data.tid}'][row-type='thread']` 780 ); 781 if (!endRowStruct) { 782 //@ts-ignore 783 endRowStruct = endParentRow.childrenList.find((item: TraceRow<ThreadStruct>) => { 784 //@ts-ignore 785 return item.rowId === `${data.tid}` && item.rowType === 'thread'; 786 }); 787 } 788 if (endRowStruct) { 789 //@ts-ignore 790 if (endRowStruct.isComplete) { 791 jankPoint(endRowStruct, selectThreadStruct, startRow, endParentRow, sp); 792 } 793 } 794 } 795} 796 797export function spSystemTraceDrawFuncLine( 798 sp: SpSystemTrace, 799 endParentRow: unknown, 800 selectFuncStruct: FuncStruct | undefined, 801 data: unknown, 802 binderTid: Number 803): void { 804 let collectList = sp.favoriteChartListEL!.getCollectRows(); 805 if (selectFuncStruct === undefined || selectFuncStruct === null) { 806 return; 807 } 808 let selectRowId = selectFuncStruct?.tid ? selectFuncStruct?.tid : binderTid.toString(); 809 let startRow = sp.shadowRoot?.querySelector<TraceRow<FuncStruct>>(`trace-row[row-id='${selectRowId}'][row-type='func']`); 810 if (!startRow) { 811 for (let collectChart of collectList) { 812 if (collectChart.rowId === selectRowId.toString() && collectChart.rowType === 'func') { 813 startRow = collectChart as TraceRow<FuncStruct>; 814 break; 815 } 816 } 817 } 818 if (endParentRow) { 819 // @ts-ignore 820 endParentRow.expansion = true; 821 let endRowStruct: unknown = sp.shadowRoot?.querySelector<TraceRow<FuncStruct>>( 822 // @ts-ignore 823 `trace-row[row-id='${data.tid}'][row-type='func']` 824 ); 825 if (!endRowStruct) {// @ts-ignore 826 endParentRow.childrenList.forEach((item) => { 827 if (item.rowId === 'sameThreadProcess') {// @ts-ignore 828 endRowStruct = endParentRow.childrenList.concat(item.childrenList).find((item: TraceRow<FuncStruct>) => { 829 // @ts-ignore 830 return item.rowId === `${data.tid}` && item.rowType === 'func'; 831 });// @ts-ignore 832 endRowStruct.parentRowEl.expansion = true; 833 } else { 834 // @ts-ignore 835 endRowStruct = endParentRow.childrenList.find((item: TraceRow<FuncStruct>) => { 836 // @ts-ignore 837 return item.rowId === `${data.tid}` && item.rowType === 'func'; 838 }); 839 } 840 }); 841 } 842 if (endRowStruct) { 843 junkBinder(endRowStruct, selectFuncStruct, startRow, endParentRow, sp, data); 844 } 845 } 846} 847