1fb726d48Sopenharmony_ci/*
2fb726d48Sopenharmony_ci * Copyright (C) 2022 Huawei Device Co., Ltd.
3fb726d48Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4fb726d48Sopenharmony_ci * you may not use this file except in compliance with the License.
5fb726d48Sopenharmony_ci * You may obtain a copy of the License at
6fb726d48Sopenharmony_ci *
7fb726d48Sopenharmony_ci *     http://www.apache.org/licenses/LICENSE-2.0
8fb726d48Sopenharmony_ci *
9fb726d48Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10fb726d48Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11fb726d48Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12fb726d48Sopenharmony_ci * See the License for the specific language governing permissions and
13fb726d48Sopenharmony_ci * limitations under the License.
14fb726d48Sopenharmony_ci */
15fb726d48Sopenharmony_ci
16fb726d48Sopenharmony_ciimport { BaseElement, element } from '../../../base-ui/BaseElement';
17fb726d48Sopenharmony_ciimport { LitTable } from '../../../base-ui/table/lit-table';
18fb726d48Sopenharmony_ciimport { SpSchedulingAnalysis } from './SpSchedulingAnalysis';
19fb726d48Sopenharmony_ciimport { procedurePool } from '../../database/Procedure';
20fb726d48Sopenharmony_ciimport { info } from '../../../log/Log';
21fb726d48Sopenharmony_ciimport '../../../base-ui/progress-bar/LitProgressBar';
22fb726d48Sopenharmony_ciimport { LitProgressBar } from '../../../base-ui/progress-bar/LitProgressBar';
23fb726d48Sopenharmony_ciimport './TableNoData';
24fb726d48Sopenharmony_ciimport { TableNoData } from './TableNoData';
25fb726d48Sopenharmony_ci
26fb726d48Sopenharmony_ci@element('top20-thread-run-time')
27fb726d48Sopenharmony_ciexport class Top20ThreadRunTime extends BaseElement {
28fb726d48Sopenharmony_ci  traceChange: boolean = false;
29fb726d48Sopenharmony_ci  private threadRunTimeTbl: LitTable | null | undefined;
30fb726d48Sopenharmony_ci  private threadRunTimeProgress: LitProgressBar | null | undefined;
31fb726d48Sopenharmony_ci  private nodata: TableNoData | null | undefined;
32fb726d48Sopenharmony_ci  private threadRunTimeData: Array<unknown> = [];
33fb726d48Sopenharmony_ci
34fb726d48Sopenharmony_ci  initElements(): void {
35fb726d48Sopenharmony_ci    this.threadRunTimeProgress = this.shadowRoot!.querySelector<LitProgressBar>('#loading');
36fb726d48Sopenharmony_ci    this.threadRunTimeTbl = this.shadowRoot!.querySelector<LitTable>('#tb-thread-run-time');
37fb726d48Sopenharmony_ci    this.nodata = this.shadowRoot!.querySelector<TableNoData>('#nodata');
38fb726d48Sopenharmony_ci
39fb726d48Sopenharmony_ci    this.threadRunTimeTbl!.addEventListener('row-click', (evt: unknown): void => {
40fb726d48Sopenharmony_ci      //@ts-ignore
41fb726d48Sopenharmony_ci      let data = evt.detail.data;
42fb726d48Sopenharmony_ci      data.isSelected = true;
43fb726d48Sopenharmony_ci      // @ts-ignore
44fb726d48Sopenharmony_ci      if ((evt.detail as unknown).callBack) {
45fb726d48Sopenharmony_ci        // @ts-ignore
46fb726d48Sopenharmony_ci        (evt.detail as unknown).callBack(true);
47fb726d48Sopenharmony_ci      }
48fb726d48Sopenharmony_ci    });
49fb726d48Sopenharmony_ci
50fb726d48Sopenharmony_ci    this.threadRunTimeTbl!.addEventListener('column-click', (evt): void => {
51fb726d48Sopenharmony_ci      // @ts-ignore
52fb726d48Sopenharmony_ci      this.sortByColumn(evt.detail);
53fb726d48Sopenharmony_ci    });
54fb726d48Sopenharmony_ci  }
55fb726d48Sopenharmony_ci
56fb726d48Sopenharmony_ci  init(): void {
57fb726d48Sopenharmony_ci    if (!this.traceChange) {
58fb726d48Sopenharmony_ci      if (this.threadRunTimeTbl!.recycleDataSource.length > 0) {
59fb726d48Sopenharmony_ci        this.threadRunTimeTbl?.reMeauseHeight();
60fb726d48Sopenharmony_ci      }
61fb726d48Sopenharmony_ci      return;
62fb726d48Sopenharmony_ci    }
63fb726d48Sopenharmony_ci    this.threadRunTimeProgress!.loading = true;
64fb726d48Sopenharmony_ci    this.traceChange = false;
65fb726d48Sopenharmony_ci    this.queryLogicWorker('scheduling-Thread RunTime', 'query Thread Cpu Run Time Analysis Time:', (res): void => {
66fb726d48Sopenharmony_ci      //@ts-ignore
67fb726d48Sopenharmony_ci      this.nodata!.noData = res === undefined || res.length === 0;
68fb726d48Sopenharmony_ci      //@ts-ignore
69fb726d48Sopenharmony_ci      this.threadRunTimeTbl!.recycleDataSource = res;
70fb726d48Sopenharmony_ci      this.threadRunTimeTbl?.reMeauseHeight();
71fb726d48Sopenharmony_ci      this.threadRunTimeProgress!.loading = false;
72fb726d48Sopenharmony_ci      //@ts-ignore
73fb726d48Sopenharmony_ci      this.threadRunTimeData = res;
74fb726d48Sopenharmony_ci    });
75fb726d48Sopenharmony_ci  }
76fb726d48Sopenharmony_ci
77fb726d48Sopenharmony_ci  clearData(): void {
78fb726d48Sopenharmony_ci    this.traceChange = true;
79fb726d48Sopenharmony_ci    this.threadRunTimeTbl!.recycleDataSource = [];
80fb726d48Sopenharmony_ci  }
81fb726d48Sopenharmony_ci
82fb726d48Sopenharmony_ci  queryLogicWorker(option: string, log: string, handler: (res: unknown) => void): void {
83fb726d48Sopenharmony_ci    let threadRunTime = new Date().getTime();
84fb726d48Sopenharmony_ci    procedurePool.submitWithName('logic0', option, { cpuMax: SpSchedulingAnalysis.cpuCount - 1 }, undefined, handler);
85fb726d48Sopenharmony_ci    let durTime = new Date().getTime() - threadRunTime;
86fb726d48Sopenharmony_ci    info(log, durTime);
87fb726d48Sopenharmony_ci  }
88fb726d48Sopenharmony_ci
89fb726d48Sopenharmony_ci  sortByColumn(detail: unknown): void {
90fb726d48Sopenharmony_ci    // @ts-ignore
91fb726d48Sopenharmony_ci    function compare(threadRunTimeProperty, sort, type) {
92fb726d48Sopenharmony_ci      return function (a: unknown, b: unknown) {
93fb726d48Sopenharmony_ci        if (type === 'number') {
94fb726d48Sopenharmony_ci          return sort === 2
95fb726d48Sopenharmony_ci            ? // @ts-ignore
96fb726d48Sopenharmony_ci              parseFloat(b[threadRunTimeProperty]) - parseFloat(a[threadRunTimeProperty])
97fb726d48Sopenharmony_ci            : //@ts-ignore
98fb726d48Sopenharmony_ci              parseFloat(a[threadRunTimeProperty]) - parseFloat(b[threadRunTimeProperty]);
99fb726d48Sopenharmony_ci        } else {
100fb726d48Sopenharmony_ci          if (sort === 2) {
101fb726d48Sopenharmony_ci            //@ts-ignore
102fb726d48Sopenharmony_ci            return b[threadRunTimeProperty].toString().localeCompare(a[threadRunTimeProperty].toString());
103fb726d48Sopenharmony_ci          } else {
104fb726d48Sopenharmony_ci            //@ts-ignore
105fb726d48Sopenharmony_ci            return a[threadRunTimeProperty].toString().localeCompare(b[threadRunTimeProperty].toString());
106fb726d48Sopenharmony_ci          }
107fb726d48Sopenharmony_ci        }
108fb726d48Sopenharmony_ci      };
109fb726d48Sopenharmony_ci    }
110fb726d48Sopenharmony_ci    //@ts-ignore
111fb726d48Sopenharmony_ci    let key = detail.key;
112fb726d48Sopenharmony_ci    if (key === 'maxDurationStr') {
113fb726d48Sopenharmony_ci      key = 'maxDuration';
114fb726d48Sopenharmony_ci      //@ts-ignore
115fb726d48Sopenharmony_ci      this.threadRunTimeData.sort(compare(key, detail.sort, 'number'));
116fb726d48Sopenharmony_ci    } else if (key === 'cpu' || key === 'no' || key === 'pid' || key === 'tid' || key === 'timestamp') {
117fb726d48Sopenharmony_ci      //@ts-ignore
118fb726d48Sopenharmony_ci      this.threadRunTimeData.sort(compare(key, detail.sort, 'number'));
119fb726d48Sopenharmony_ci    } else {
120fb726d48Sopenharmony_ci      //@ts-ignore
121fb726d48Sopenharmony_ci      this.threadRunTimeData.sort(compare(key, detail.sort, 'string'));
122fb726d48Sopenharmony_ci    }
123fb726d48Sopenharmony_ci    this.threadRunTimeTbl!.recycleDataSource = this.threadRunTimeData;
124fb726d48Sopenharmony_ci  }
125fb726d48Sopenharmony_ci
126fb726d48Sopenharmony_ci  initHtml(): string {
127fb726d48Sopenharmony_ci    return `
128fb726d48Sopenharmony_ci        <style>
129fb726d48Sopenharmony_ci        :host {
130fb726d48Sopenharmony_ci            width: 100%;
131fb726d48Sopenharmony_ci            height: 100%;
132fb726d48Sopenharmony_ci            background-color: var(--dark-background5,#F6F6F6);
133fb726d48Sopenharmony_ci        }
134fb726d48Sopenharmony_ci        .tb_run_time{
135fb726d48Sopenharmony_ci            overflow: auto ;
136fb726d48Sopenharmony_ci            border-radius: 5px;
137fb726d48Sopenharmony_ci            border: solid 1px var(--dark-border1,#e0e0e0);
138fb726d48Sopenharmony_ci            margin: 10px 10px 0 10px;
139fb726d48Sopenharmony_ci            padding: 5px 15px
140fb726d48Sopenharmony_ci        }
141fb726d48Sopenharmony_ci        </style>
142fb726d48Sopenharmony_ci        <lit-progress-bar id="loading" style="height: 1px;width: 100%" loading></lit-progress-bar>
143fb726d48Sopenharmony_ci        <div style="height: 5px"></div>
144fb726d48Sopenharmony_ci        <div class="tb_run_time" >
145fb726d48Sopenharmony_ci            <table-no-data id="nodata" contentHeight="500px">
146fb726d48Sopenharmony_ci                <lit-table id="tb-thread-run-time" style="height: auto;" hideDownload>
147fb726d48Sopenharmony_ci                    <lit-table-column width="90px" title="NO" data-index="no" key="no" align="flex-start" order></lit-table-column>
148fb726d48Sopenharmony_ci                    <lit-table-column width="140px" title="tid" data-index="tid" key="tid" align="flex-start" order></lit-table-column>
149fb726d48Sopenharmony_ci                    <lit-table-column width="240px" title="t_name" data-index="tName" key="tName" align="flex-start" order></lit-table-column>
150fb726d48Sopenharmony_ci                    <lit-table-column width="140px" title="pid" data-index="pid" key="pid" align="flex-start" order></lit-table-column>
151fb726d48Sopenharmony_ci                    <lit-table-column width="240px" title="p_name" data-index="pName" key="pName" align="flex-start" order></lit-table-column>
152fb726d48Sopenharmony_ci                    <lit-table-column width="140px" title="max duration" data-index="maxDurationStr" key="maxDurationStr" align="flex-start" order></lit-table-column>
153fb726d48Sopenharmony_ci                    <lit-table-column width="200px" title="timestamp" data-index="timestamp" key="timestamp" align="flex-start" order>
154fb726d48Sopenharmony_ci                        <template>
155fb726d48Sopenharmony_ci                            <div onclick="{
156fb726d48Sopenharmony_ci                                window.publish(window.SmartEvent.UI.SliceMark,this.parentElement.parentElement.data)
157fb726d48Sopenharmony_ci                            }">{{timestamp}}</div>
158fb726d48Sopenharmony_ci                        </template>
159fb726d48Sopenharmony_ci                    </lit-table-column>
160fb726d48Sopenharmony_ci                    <lit-table-column width="140px" title="cpu" data-index="cpu" key="cpu" align="flex-start" order></lit-table-column>
161fb726d48Sopenharmony_ci                </lit-table>
162fb726d48Sopenharmony_ci            </table-no-data>
163fb726d48Sopenharmony_ci        </div>
164fb726d48Sopenharmony_ci        <div style="height: 10px"></div>
165fb726d48Sopenharmony_ci        `;
166fb726d48Sopenharmony_ci  }
167fb726d48Sopenharmony_ci}
168