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 this 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
16#include <__config>
17#include <cstdint>
18#include <cstring>
19#include <unistd.h>
20#include <iosfwd>
21#include <iostream>
22#include <ostream>
23#include <thread>
24#include <vector>
25
26#include "hitrace_meter.h"
27
28using namespace std;
29namespace {
30constexpr int SLEEP_ONE_SECOND = 1;
31constexpr int SLEEP_TWO_SECOND = 2;
32constexpr int USLEEP_HALF_SECOND = 500000;
33constexpr int CYCLE_TIMES = 3;
34constexpr int32_t TASK_ID = 111;
35const vector<uint64_t> LABEL_TAGS = {
36    HITRACE_TAG_OHOS,
37    HITRACE_TAG_INTERCONNECTION,
38    HITRACE_TAG_DLP_CREDENTIAL,
39    HITRACE_TAG_ACCESS_CONTROL,
40    HITRACE_TAG_NET,
41    HITRACE_TAG_NWEB,
42    HITRACE_TAG_HUKS,
43    HITRACE_TAG_USERIAM,
44    HITRACE_TAG_DISTRIBUTED_AUDIO,
45    HITRACE_TAG_DLSM,
46    HITRACE_TAG_FILEMANAGEMENT,
47    HITRACE_TAG_ABILITY_MANAGER,
48    HITRACE_TAG_ZCAMERA,
49    HITRACE_TAG_ZMEDIA,
50    HITRACE_TAG_ZIMAGE,
51    HITRACE_TAG_ZAUDIO,
52    HITRACE_TAG_DISTRIBUTEDDATA,
53    HITRACE_TAG_MDFS,
54    HITRACE_TAG_GRAPHIC_AGP,
55    HITRACE_TAG_ACE,
56    HITRACE_TAG_NOTIFICATION,
57    HITRACE_TAG_MISC,
58    HITRACE_TAG_MULTIMODALINPUT,
59    HITRACE_TAG_SENSORS,
60    HITRACE_TAG_MSDP,
61    HITRACE_TAG_DSOFTBUS,
62    HITRACE_TAG_RPC,
63    HITRACE_TAG_ARK,
64    HITRACE_TAG_WINDOW_MANAGER,
65    HITRACE_TAG_ACCOUNT_MANAGER,
66    HITRACE_TAG_DISTRIBUTED_SCREEN,
67    HITRACE_TAG_DISTRIBUTED_CAMERA,
68    HITRACE_TAG_DISTRIBUTED_HARDWARE_FWK,
69    HITRACE_TAG_GLOBAL_RESMGR,
70    HITRACE_TAG_DEVICE_MANAGER,
71    HITRACE_TAG_SAMGR,
72    HITRACE_TAG_POWER,
73    HITRACE_TAG_DISTRIBUTED_SCHEDULE,
74    HITRACE_TAG_DEVICE_PROFILE,
75    HITRACE_TAG_DISTRIBUTED_INPUT,
76    HITRACE_TAG_BLUETOOTH,
77    HITRACE_TAG_ACCESSIBILITY_MANAGER,
78    HITRACE_TAG_APP
79};
80
81void FuncA()
82{
83    cout << "funcA" << endl;
84    usleep(USLEEP_HALF_SECOND);
85}
86
87void FuncB()
88{
89    cout << "funcB" << endl;
90    usleep(USLEEP_HALF_SECOND);
91}
92
93void FuncC(uint64_t label)
94{
95    cout << "funcC" << endl;
96    int num = 0;
97    for (int i = 0; i < CYCLE_TIMES; i++) {
98        CountTrace(label, "count number", ++num);
99        usleep(USLEEP_HALF_SECOND);
100    }
101}
102
103void ThreadFunc1(uint64_t label)
104{
105    StartAsyncTrace(label, "testAsync", TASK_ID);
106    for (int i = 0; i < CYCLE_TIMES; ++i) {
107        cout << "t1" << endl;
108        usleep(USLEEP_HALF_SECOND);
109    }
110}
111
112void ThreadFunc2(uint64_t label)
113{
114    for (int i = 0; i < CYCLE_TIMES; ++i) {
115        cout << "t2" << endl;
116        usleep(USLEEP_HALF_SECOND);
117    }
118    FinishAsyncTrace(label, "testAsync", TASK_ID);
119}
120
121void FuncMain(uint64_t label)
122{
123    thread t1(ThreadFunc1, label);
124    t1.join();
125
126    StartTrace(label, "testStart");
127    usleep(USLEEP_HALF_SECOND);
128
129    StartTrace(label, "funcAStart", SLEEP_ONE_SECOND); // 打印起始点
130    FuncA();
131    FinishTrace(label);
132    usleep(USLEEP_HALF_SECOND);
133
134    thread t2(ThreadFunc2, label);
135    t2.join();
136
137    StartTrace(label, "funcBStart", SLEEP_TWO_SECOND);
138    FuncB();
139    FinishTrace(label);
140    sleep(SLEEP_ONE_SECOND);
141
142    FinishTrace(label);
143    FuncC(label);
144}
145} // namespace
146
147int main()
148{
149    for (auto tag : LABEL_TAGS) {
150        FuncMain(tag);
151    }
152    return 0;
153}
154