1// Copyright (c) 2021 Huawei Device Co., Ltd.
2// Licensed under the Apache License, Version 2.0 (the "License");
3// you may not use this file except in compliance with the License.
4// You may obtain a copy of the License at
5//
6//     http://www.apache.org/licenses/LICENSE-2.0
7//
8// Unless required by applicable law or agreed to in writing, software
9// distributed under the License is distributed on an "AS IS" BASIS,
10// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
11// See the License for the specific language governing permissions and
12// limitations under the License.
13
14import { TraficEnum } from './utils/QueryEnum';
15import { dmaFenceList } from './utils/AllMemoryCache';
16import { filterDataByGroup } from './utils/DataFilter';
17export const queryPresentInfo = (args: unknown): string => {
18  return `WITH state AS (  
19    SELECT      
20        id,     
21        ts,      
22        cat,      
23        driver,      
24        timeline,      
25        context,      
26        seqno,    
27        CASE       
28           WHEN LAG(cat) OVER (ORDER BY ts) = '${//@ts-ignore
29    args.dmaFenceInit}'  AND  LAG(driver) OVER (ORDER BY ts) = ''   
30				   THEN LAG(ts, 2) OVER (ORDER BY ts) 
31           ELSE LAG(ts) OVER (ORDER BY ts)      
32        END AS new_ts,    
33        CASE    
34            WHEN LAG(cat) OVER (ORDER BY ts) = '${//@ts-ignore
35    args.dmaFenceInit}' AND  LAG(driver) OVER (ORDER BY ts) = '' 
36            THEN Dur + LAG(dur) OVER (ORDER BY ts)      
37            ELSE Dur     
38        END AS newDur,    
39        ROW_NUMBER() OVER (ORDER BY ts) AS rn 
40        FROM  
41        dma_fence  
42        WHERE  
43        timeline = '${//@ts-ignore
44    args.dmaFenceName}'  
45    )  
46    SELECT    
47        s.id,    
48        s.new_ts - COALESCE(r.start_ts, 0) AS startTime,    
49        s.newDur AS dur,    
50        s.new_ts - COALESCE(r.start_ts, 0) + s.newDur AS endTime,    
51        s.cat,    
52        s.driver,    
53        s.timeline,    
54        s.context,    
55        s.seqno
56    FROM    
57        state s    
58    LEFT JOIN trace_range r ON s.new_ts BETWEEN r.start_ts AND r.end_ts     
59    WHERE  
60        s.cat <> '${//@ts-ignore
61    args.dmaFenceInit}'
62    		AND s.rn > 1
63    ORDER BY    
64        s.new_ts;`;
65};
66
67export function dmaFenceReceiver(data: unknown, proc: Function): void {
68  //@ts-ignore
69  if (data.params.trafic === TraficEnum.Memory) {
70    let res: unknown[];
71    //@ts-ignore
72    if (!dmaFenceList.has(data.params.dmaFenceName)) {
73      //@ts-ignore
74      res = proc(queryPresentInfo(data.params));
75      //@ts-ignore
76      dmaFenceList.set(data.params.dmaFenceName, res);
77    } else {
78      //@ts-ignore
79      res = dmaFenceList.get(data.params.dmaFenceName) || [];
80    }
81    //@ts-ignore
82    res = filterDataByGroup(res || [], 'startTime', 'dur', data.params.startNS, data.params.endNS, data.params.width, '', undefined, true, true);
83    arrayBufferHandler(data, res, true);
84  } else {
85    //@ts-ignore
86    let sql = queryPresentInfo(data.params);
87    let res = proc(sql);
88    //@ts-ignore
89    arrayBufferHandler(data, res, data.params.trafic !== TraficEnum.SharedArrayBuffer);
90  }
91}
92
93function arrayBufferHandler(data: unknown, res: unknown[], transfer: boolean): void {
94  //@ts-ignore
95  let startTime = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.startTime);
96  //@ts-ignore
97  let dur = new Float64Array(transfer ? res.length : data.params.sharedArrayBuffers.dur);
98  //@ts-ignore
99  let id = new Uint16Array(transfer ? res.length : data.params.sharedArrayBuffers.id);
100  res.forEach((it, i) => {
101    //@ts-ignore
102    startTime[i] = it.startTime;
103    //@ts-ignore
104    dur[i] = it.dur;
105    //@ts-ignore
106    id[i] = it.id;
107  });
108  (self as unknown as Worker).postMessage(
109    {
110      //@ts-ignore
111      id: data.id,
112      //@ts-ignore
113      action: data.action,
114      results: transfer
115        ? {
116          startTime: startTime.buffer,
117          dur: dur.buffer,
118          id: id.buffer,
119        }
120        : {},
121      len: res.length,
122      transfer: transfer,
123    },
124    transfer ? [startTime.buffer, dur.buffer, id.buffer] : []
125  );
126}