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