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 
28 using namespace std;
29 namespace {
30 constexpr int SLEEP_ONE_SECOND = 1;
31 constexpr int SLEEP_TWO_SECOND = 2;
32 constexpr int USLEEP_HALF_SECOND = 500000;
33 constexpr int CYCLE_TIMES = 3;
34 constexpr int32_t TASK_ID = 111;
35 const 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 
FuncA()81 void FuncA()
82 {
83     cout << "funcA" << endl;
84     usleep(USLEEP_HALF_SECOND);
85 }
86 
FuncB()87 void FuncB()
88 {
89     cout << "funcB" << endl;
90     usleep(USLEEP_HALF_SECOND);
91 }
92 
FuncC(uint64_t label)93 void 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 
ThreadFunc1(uint64_t label)103 void 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 
ThreadFunc2(uint64_t label)112 void 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 
FuncMain(uint64_t label)121 void 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 
main()147 int main()
148 {
149     for (auto tag : LABEL_TAGS) {
150         FuncMain(tag);
151     }
152     return 0;
153 }
154