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