• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2023 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 <vector>
17 #include <thread>
18 #include <mutex>
19 #include <chrono>
20 #include <string>
21 #include "ffrt_inner.h"
22 #ifdef USE_GTEST
23 #include <gtest/gtest.h>
24 #else
25 #include "ptest.h"
26 #endif
27 #include "dfx/log/ffrt_log_api.h"
28 
29 using namespace std;
30 using namespace ffrt;
31 
32 // its value is equles to the number of submitted task
NestedFib(int num,int & count)33 void NestedFib(int num, int &count)
34 {
35     if (num <= 1) {
36         count = 0;
37     } else {
38         int val1;
39         int val2;
40         ffrt::submit([&]() { NestedFib(num - 1, val1); }, {}, { &val1 });
41         ffrt::submit([&]() { NestedFib(num - 2, val2); }, {}, { &val2 });
42         ffrt::wait({ &val1, &val2 });
43         count = val1 + val2 + 2;
44     }
45 }
46 
NestedAddOne(int deepth,int & val)47 void NestedAddOne(int deepth, int &val)
48 {
49     if (deepth == 0) {
50         val = 0;
51     } else {
52         ffrt::submit([&]() { NestedAddOne(deepth - 1, val); }, { &val }, { &val },
53             ffrt::task_attr().name(("n" + std::to_string(deepth)).c_str()));
54         ffrt::wait({ &val });
55         val += 1;
56     }
57 }
58 
NestedWhile(uint64_t count)59 void NestedWhile(uint64_t count)
60 {
61     int x = 1;
62     int y0;
63     int y1;
64     int y2;
65     int y3;
66     int y4;
67     int y5;
68     int y6;
69     int y7;
70     int y8;
71     int y9;
72     int i = 1;
73     while (count-- > 0) {
74         ffrt::submit(
75             [&]() {
76                 ffrt::submit(
77                     [&]() {
78                         ffrt::submit(
79                             [&]() {
80                                 ffrt::submit(
81                                     [&]() {
82                                         ffrt::submit(
83                                             [&]() {
84                                                 ffrt::submit(
85                                                     [&]() {
86                                                         ffrt::submit(
87                                                             [&]() {
88                                                                 ffrt::submit(
89                                                                     [&]() {
90                                                                         ffrt::submit(
91                                                                             [&]() {
92                                                                                 ffrt::submit(
93                                                                                     [&]() {
94                                                                                         ffrt::submit(
95                                                                                             [&]() {
96                                                                                                 y9 = x + 1;
97                                                                                                 EXPECT_EQ(y9, 2);
98                                                                                             },
99                                                                                             { &x }, { &y9 },
100                                                                                             ffrt::task_attr()
101                                                                                             .name(("y9s1w" +
102                                                                                             to_string(i))
103                                                                                             .c_str()));
104                                                                                         ffrt::submit(
105                                                                                             [&]() {
106                                                                                                 y9++;
107                                                                                                 EXPECT_EQ(y9, 3);
108                                                                                             },
109                                                                                             { &y9 }, { &y9 },
110                                                                                             ffrt::task_attr()
111                                                                                             .name(("y9s2w" +
112                                                                                             to_string(i))
113                                                                                             .c_str()));
114                                                                                         ffrt::wait();
115                                                                                     },
116                                                                                     {}, { &y9 },
117                                                                                     ffrt::task_attr()
118                                                                                     .name(("y9w" + to_string(i))
119                                                                                     .c_str()));
120                                                                                 ffrt::submit(
121                                                                                     [&]() {
122                                                                                         y8 = y9 + 1;
123                                                                                         EXPECT_EQ(y8, 4);
124                                                                                     },
125                                                                                     { &y9 }, { &y8 },
126                                                                                     ffrt::task_attr()
127                                                                                     .name(("y8s1w" + to_string(i))
128                                                                                     .c_str()));
129                                                                                 ffrt::wait();
130                                                                             },
131                                                                             {}, { &y8 },
132                                                                             ffrt::task_attr()
133                                                                             .name(("y8w" + to_string(i))
134                                                                             .c_str()));
135                                                                         ffrt::submit(
136                                                                             [&]() {
137                                                                                 y7 = y8 + 1;
138                                                                                 EXPECT_EQ(y7, 5);
139                                                                             },
140                                                                             { &y8 }, { &y7 },
141                                                                             ffrt::task_attr()
142                                                                             .name(("y7s1w" + to_string(i))
143                                                                             .c_str()));
144                                                                         ffrt::wait();
145                                                                     },
146                                                                     {}, { &y7 },
147                                                                     ffrt::task_attr()
148                                                                     .name(("y7w" + to_string(i))
149                                                                     .c_str()));
150                                                                 ffrt::submit(
151                                                                     [&]() {
152                                                                         y6 = y7 + 1;
153                                                                         EXPECT_EQ(y6, 6);
154                                                                     },
155                                                                     { &y7 }, { &y6 },
156                                                                     ffrt::task_attr()
157                                                                     .name(("y6s1w" + to_string(i))
158                                                                     .c_str()));
159                                                                 ffrt::wait();
160                                                             },
161                                                             {}, { &y6 },
162                                                             ffrt::task_attr().name(("y6w" + to_string(i)).c_str()));
163                                                         ffrt::submit(
164                                                             [&]() {
165                                                                 y5 = y6 + 1;
166                                                                 EXPECT_EQ(y5, 7);
167                                                             },
168                                                             { &y6 }, { &y5 },
169                                                             ffrt::task_attr()
170                                                             .name(("y5s1w" + to_string(i))
171                                                             .c_str()));
172                                                         ffrt::wait();
173                                                     },
174                                                     {}, { &y5 },
175                                                     ffrt::task_attr().name(("y5w" + to_string(i)).c_str()));
176                                                 ffrt::submit(
177                                                     [&]() {
178                                                         y4 = y5 + 1;
179                                                         EXPECT_EQ(y4, 8);
180                                                     },
181                                                     { &y5 }, { &y4 },
182                                                     ffrt::task_attr().name(("y4s1w" + to_string(i)).c_str()));
183                                                 ffrt::wait();
184                                             },
185                                             {}, { &y4 }, ffrt::task_attr().name(("y4w" + to_string(i)).c_str()));
186                                         ffrt::submit(
187                                             [&]() {
188                                                 y3 = y4 + 1;
189                                                 EXPECT_EQ(y3, 9);
190                                             },
191                                             { &y4 }, { &y3 }, ffrt::task_attr().name(("y3s1w" + to_string(i))
192                                             .c_str()));
193                                         ffrt::wait();
194                                     },
195                                     {}, { &y3 }, ffrt::task_attr().name(("y3w" + to_string(i)).c_str()));
196                                 ffrt::submit(
197                                     [&]() {
198                                         y2 = y3 + 1;
199                                         EXPECT_EQ(y2, 10);
200                                     },
201                                     { &y3 }, { &y2 }, ffrt::task_attr().name(("y2s1w" + to_string(i)).c_str()));
202                                 ffrt::wait();
203                             },
204                             {}, { &y2 }, ffrt::task_attr().name(("y2w" + to_string(i)).c_str()));
205                         ffrt::submit(
206                             [&]() {
207                                 y1 = y2 + 1;
208                                 EXPECT_EQ(y1, 11);
209                             },
210                             { &y2 }, { &y1 }, ffrt::task_attr().name(("y1s1w" + to_string(i)).c_str()));
211                         ffrt::wait();
212                     },
213                     {}, { &y1 }, ffrt::task_attr().name(("y1w" + to_string(i)).c_str()));
214                 ffrt::submit(
215                     [&]() {
216                         y0 = y1 + 1;
217                         EXPECT_EQ(y0, 12);
218                     },
219                     { &y1 }, { &y0 }, ffrt::task_attr().name(("y0s1w" + to_string(i)).c_str()));
220                 ffrt::wait();
221             },
222             {}, { &y0 }, ffrt::task_attr().name(("y0w" + to_string(i)).c_str()));
223         ffrt::wait({ &y0 });
224         EXPECT_EQ(y0, 12);
225         i++;
226     }
227 }
228