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