1484543d1Sopenharmony_ci/*
2484543d1Sopenharmony_ci * Copyright (c) 2023 Huawei Device Co., Ltd.
3484543d1Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License");
4484543d1Sopenharmony_ci * you may not use this file except in compliance with the License.
5484543d1Sopenharmony_ci * You may obtain a copy of the License at
6484543d1Sopenharmony_ci *
7484543d1Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0
8484543d1Sopenharmony_ci *
9484543d1Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software
10484543d1Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS,
11484543d1Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12484543d1Sopenharmony_ci * See the License for the specific language governing permissions and
13484543d1Sopenharmony_ci * limitations under the License.
14484543d1Sopenharmony_ci */
15484543d1Sopenharmony_ci
16484543d1Sopenharmony_ci#include <vector>
17484543d1Sopenharmony_ci#include <cmath>
18484543d1Sopenharmony_ci#include <thread>
19484543d1Sopenharmony_ci#include <mutex>
20484543d1Sopenharmony_ci#include <chrono>
21484543d1Sopenharmony_ci#include <string>
22484543d1Sopenharmony_ci#include "ffrt_inner.h"
23484543d1Sopenharmony_ci#include <gtest/gtest.h>
24484543d1Sopenharmony_ci#include "dfx/log/ffrt_log_api.h"
25484543d1Sopenharmony_ci
26484543d1Sopenharmony_ciusing namespace std;
27484543d1Sopenharmony_ciusing namespace ffrt;
28484543d1Sopenharmony_ci
29484543d1Sopenharmony_ci// its value is equles to the number of submitted task
30484543d1Sopenharmony_civoid NestedFib(int num, int &count)
31484543d1Sopenharmony_ci{
32484543d1Sopenharmony_ci    if (num <= 1) {
33484543d1Sopenharmony_ci        count = 0;
34484543d1Sopenharmony_ci    } else {
35484543d1Sopenharmony_ci        int val1, val2;
36484543d1Sopenharmony_ci        ffrt::submit([&]() { NestedFib(num - 1, val1); }, {}, { &val1 });
37484543d1Sopenharmony_ci        ffrt::submit([&]() { NestedFib(num - 2, val2); }, {}, { &val2 });
38484543d1Sopenharmony_ci        ffrt::wait({ &val1, &val2 });
39484543d1Sopenharmony_ci        count = val1 + val2 + 2;
40484543d1Sopenharmony_ci    }
41484543d1Sopenharmony_ci}
42484543d1Sopenharmony_ci
43484543d1Sopenharmony_civoid NestedAddOne(int deepth, int &val)
44484543d1Sopenharmony_ci{
45484543d1Sopenharmony_ci    if (deepth == 0) {
46484543d1Sopenharmony_ci        val = 0;
47484543d1Sopenharmony_ci    } else {
48484543d1Sopenharmony_ci        ffrt::submit([&]() { NestedAddOne(deepth - 1, val); }, { &val }, { &val },
49484543d1Sopenharmony_ci            ffrt::task_attr().name(("n" + std::to_string(deepth)).c_str()));
50484543d1Sopenharmony_ci        ffrt::wait({ &val });
51484543d1Sopenharmony_ci        val += 1;
52484543d1Sopenharmony_ci    }
53484543d1Sopenharmony_ci}
54484543d1Sopenharmony_ci
55484543d1Sopenharmony_civoid NestedWhile(uint64_t count)
56484543d1Sopenharmony_ci{
57484543d1Sopenharmony_ci    int x = 1, y0, y1, y2, y3, y4, y5, y6, y7, y8, y9, i = 1;
58484543d1Sopenharmony_ci    while (count--) {
59484543d1Sopenharmony_ci        ffrt::submit(
60484543d1Sopenharmony_ci            [&]() {
61484543d1Sopenharmony_ci                ffrt::submit(
62484543d1Sopenharmony_ci                    [&]() {
63484543d1Sopenharmony_ci                        ffrt::submit(
64484543d1Sopenharmony_ci                            [&]() {
65484543d1Sopenharmony_ci                                ffrt::submit(
66484543d1Sopenharmony_ci                                    [&]() {
67484543d1Sopenharmony_ci                                        ffrt::submit(
68484543d1Sopenharmony_ci                                            [&]() {
69484543d1Sopenharmony_ci                                                ffrt::submit(
70484543d1Sopenharmony_ci                                                    [&]() {
71484543d1Sopenharmony_ci                                                        ffrt::submit(
72484543d1Sopenharmony_ci                                                            [&]() {
73484543d1Sopenharmony_ci                                                                ffrt::submit(
74484543d1Sopenharmony_ci                                                                    [&]() {
75484543d1Sopenharmony_ci                                                                        ffrt::submit(
76484543d1Sopenharmony_ci                                                                            [&]() {
77484543d1Sopenharmony_ci                                                                                ffrt::submit(
78484543d1Sopenharmony_ci                                                                                    [&]() {
79484543d1Sopenharmony_ci                                                                                        ffrt::submit(
80484543d1Sopenharmony_ci                                                                                            [&]() {
81484543d1Sopenharmony_ci                                                                                                y9 = x + 1;
82484543d1Sopenharmony_ci                                                                                                EXPECT_EQ(y9, 2);
83484543d1Sopenharmony_ci                                                                                            },
84484543d1Sopenharmony_ci                                                                                            { &x }, { &y9 },
85484543d1Sopenharmony_ci                                                                                            ffrt::task_attr()
86484543d1Sopenharmony_ci                                                                                            .name(("y9s1w" +
87484543d1Sopenharmony_ci                                                                                            to_string(i))
88484543d1Sopenharmony_ci                                                                                            .c_str()));
89484543d1Sopenharmony_ci                                                                                        ffrt::submit(
90484543d1Sopenharmony_ci                                                                                            [&]() {
91484543d1Sopenharmony_ci                                                                                                y9++;
92484543d1Sopenharmony_ci                                                                                                EXPECT_EQ(y9, 3);
93484543d1Sopenharmony_ci                                                                                            },
94484543d1Sopenharmony_ci                                                                                            { &y9 }, { &y9 },
95484543d1Sopenharmony_ci                                                                                            ffrt::task_attr()
96484543d1Sopenharmony_ci                                                                                            .name(("y9s2w" +
97484543d1Sopenharmony_ci                                                                                            to_string(i))
98484543d1Sopenharmony_ci                                                                                            .c_str()));
99484543d1Sopenharmony_ci                                                                                        ffrt::wait();
100484543d1Sopenharmony_ci                                                                                    },
101484543d1Sopenharmony_ci                                                                                    {}, { &y9 },
102484543d1Sopenharmony_ci                                                                                    ffrt::task_attr()
103484543d1Sopenharmony_ci                                                                                    .name(("y9w" + to_string(i))
104484543d1Sopenharmony_ci                                                                                    .c_str()));
105484543d1Sopenharmony_ci                                                                                ffrt::submit(
106484543d1Sopenharmony_ci                                                                                    [&]() {
107484543d1Sopenharmony_ci                                                                                        y8 = y9 + 1;
108484543d1Sopenharmony_ci                                                                                        EXPECT_EQ(y8, 4);
109484543d1Sopenharmony_ci                                                                                    },
110484543d1Sopenharmony_ci                                                                                    { &y9 }, { &y8 },
111484543d1Sopenharmony_ci                                                                                    ffrt::task_attr()
112484543d1Sopenharmony_ci                                                                                    .name(("y8s1w" + to_string(i))
113484543d1Sopenharmony_ci                                                                                    .c_str()));
114484543d1Sopenharmony_ci                                                                                ffrt::wait();
115484543d1Sopenharmony_ci                                                                            },
116484543d1Sopenharmony_ci                                                                            {}, { &y8 },
117484543d1Sopenharmony_ci                                                                            ffrt::task_attr()
118484543d1Sopenharmony_ci                                                                            .name(("y8w" + to_string(i))
119484543d1Sopenharmony_ci                                                                            .c_str()));
120484543d1Sopenharmony_ci                                                                        ffrt::submit(
121484543d1Sopenharmony_ci                                                                            [&]() {
122484543d1Sopenharmony_ci                                                                                y7 = y8 + 1;
123484543d1Sopenharmony_ci                                                                                EXPECT_EQ(y7, 5);
124484543d1Sopenharmony_ci                                                                            },
125484543d1Sopenharmony_ci                                                                            { &y8 }, { &y7 },
126484543d1Sopenharmony_ci                                                                            ffrt::task_attr()
127484543d1Sopenharmony_ci                                                                            .name(("y7s1w" + to_string(i))
128484543d1Sopenharmony_ci                                                                            .c_str()));
129484543d1Sopenharmony_ci                                                                        ffrt::wait();
130484543d1Sopenharmony_ci                                                                    },
131484543d1Sopenharmony_ci                                                                    {}, { &y7 },
132484543d1Sopenharmony_ci                                                                    ffrt::task_attr()
133484543d1Sopenharmony_ci                                                                    .name(("y7w" + to_string(i))
134484543d1Sopenharmony_ci                                                                    .c_str()));
135484543d1Sopenharmony_ci                                                                ffrt::submit(
136484543d1Sopenharmony_ci                                                                    [&]() {
137484543d1Sopenharmony_ci                                                                        y6 = y7 + 1;
138484543d1Sopenharmony_ci                                                                        EXPECT_EQ(y6, 6);
139484543d1Sopenharmony_ci                                                                    },
140484543d1Sopenharmony_ci                                                                    { &y7 }, { &y6 },
141484543d1Sopenharmony_ci                                                                    ffrt::task_attr()
142484543d1Sopenharmony_ci                                                                    .name(("y6s1w" + to_string(i))
143484543d1Sopenharmony_ci                                                                    .c_str()));
144484543d1Sopenharmony_ci                                                                ffrt::wait();
145484543d1Sopenharmony_ci                                                            },
146484543d1Sopenharmony_ci                                                            {}, { &y6 },
147484543d1Sopenharmony_ci                                                            ffrt::task_attr().name(("y6w" + to_string(i)).c_str()));
148484543d1Sopenharmony_ci                                                        ffrt::submit(
149484543d1Sopenharmony_ci                                                            [&]() {
150484543d1Sopenharmony_ci                                                                y5 = y6 + 1;
151484543d1Sopenharmony_ci                                                                EXPECT_EQ(y5, 7);
152484543d1Sopenharmony_ci                                                            },
153484543d1Sopenharmony_ci                                                            { &y6 }, { &y5 },
154484543d1Sopenharmony_ci                                                            ffrt::task_attr()
155484543d1Sopenharmony_ci                                                            .name(("y5s1w" + to_string(i))
156484543d1Sopenharmony_ci                                                            .c_str()));
157484543d1Sopenharmony_ci                                                        ffrt::wait();
158484543d1Sopenharmony_ci                                                    },
159484543d1Sopenharmony_ci                                                    {}, { &y5 },
160484543d1Sopenharmony_ci                                                    ffrt::task_attr().name(("y5w" + to_string(i)).c_str()));
161484543d1Sopenharmony_ci                                                ffrt::submit(
162484543d1Sopenharmony_ci                                                    [&]() {
163484543d1Sopenharmony_ci                                                        y4 = y5 + 1;
164484543d1Sopenharmony_ci                                                        EXPECT_EQ(y4, 8);
165484543d1Sopenharmony_ci                                                    },
166484543d1Sopenharmony_ci                                                    { &y5 }, { &y4 },
167484543d1Sopenharmony_ci                                                    ffrt::task_attr().name(("y4s1w" + to_string(i)).c_str()));
168484543d1Sopenharmony_ci                                                ffrt::wait();
169484543d1Sopenharmony_ci                                            },
170484543d1Sopenharmony_ci                                            {}, { &y4 }, ffrt::task_attr().name(("y4w" + to_string(i)).c_str()));
171484543d1Sopenharmony_ci                                        ffrt::submit(
172484543d1Sopenharmony_ci                                            [&]() {
173484543d1Sopenharmony_ci                                                y3 = y4 + 1;
174484543d1Sopenharmony_ci                                                EXPECT_EQ(y3, 9);
175484543d1Sopenharmony_ci                                            },
176484543d1Sopenharmony_ci                                            { &y4 }, { &y3 }, ffrt::task_attr().name(("y3s1w" + to_string(i))
177484543d1Sopenharmony_ci                                            .c_str()));
178484543d1Sopenharmony_ci                                        ffrt::wait();
179484543d1Sopenharmony_ci                                    },
180484543d1Sopenharmony_ci                                    {}, { &y3 }, ffrt::task_attr().name(("y3w" + to_string(i)).c_str()));
181484543d1Sopenharmony_ci                                ffrt::submit(
182484543d1Sopenharmony_ci                                    [&]() {
183484543d1Sopenharmony_ci                                        y2 = y3 + 1;
184484543d1Sopenharmony_ci                                        EXPECT_EQ(y2, 10);
185484543d1Sopenharmony_ci                                    },
186484543d1Sopenharmony_ci                                    { &y3 }, { &y2 }, ffrt::task_attr().name(("y2s1w" + to_string(i)).c_str()));
187484543d1Sopenharmony_ci                                ffrt::wait();
188484543d1Sopenharmony_ci                            },
189484543d1Sopenharmony_ci                            {}, { &y2 }, ffrt::task_attr().name(("y2w" + to_string(i)).c_str()));
190484543d1Sopenharmony_ci                        ffrt::submit(
191484543d1Sopenharmony_ci                            [&]() {
192484543d1Sopenharmony_ci                                y1 = y2 + 1;
193484543d1Sopenharmony_ci                                EXPECT_EQ(y1, 11);
194484543d1Sopenharmony_ci                            },
195484543d1Sopenharmony_ci                            { &y2 }, { &y1 }, ffrt::task_attr().name(("y1s1w" + to_string(i)).c_str()));
196484543d1Sopenharmony_ci                        ffrt::wait();
197484543d1Sopenharmony_ci                    },
198484543d1Sopenharmony_ci                    {}, { &y1 }, ffrt::task_attr().name(("y1w" + to_string(i)).c_str()));
199484543d1Sopenharmony_ci                ffrt::submit(
200484543d1Sopenharmony_ci                    [&]() {
201484543d1Sopenharmony_ci                        y0 = y1 + 1;
202484543d1Sopenharmony_ci                        EXPECT_EQ(y0, 12);
203484543d1Sopenharmony_ci                    },
204484543d1Sopenharmony_ci                    { &y1 }, { &y0 }, ffrt::task_attr().name(("y0s1w" + to_string(i)).c_str()));
205484543d1Sopenharmony_ci                ffrt::wait();
206484543d1Sopenharmony_ci            },
207484543d1Sopenharmony_ci            {}, { &y0 }, ffrt::task_attr().name(("y0w" + to_string(i)).c_str()));
208484543d1Sopenharmony_ci        ffrt::wait({ &y0 });
209484543d1Sopenharmony_ci        EXPECT_EQ(y0, 12);
210484543d1Sopenharmony_ci        i++;
211484543d1Sopenharmony_ci    }
212484543d1Sopenharmony_ci}
213