151c0b2f7Stbbdev /*
2*b15aabb3Stbbdev     Copyright (c) 2020-2021 Intel Corporation
351c0b2f7Stbbdev 
451c0b2f7Stbbdev     Licensed under the Apache License, Version 2.0 (the "License");
551c0b2f7Stbbdev     you may not use this file except in compliance with the License.
651c0b2f7Stbbdev     You may obtain a copy of the License at
751c0b2f7Stbbdev 
851c0b2f7Stbbdev         http://www.apache.org/licenses/LICENSE-2.0
951c0b2f7Stbbdev 
1051c0b2f7Stbbdev     Unless required by applicable law or agreed to in writing, software
1151c0b2f7Stbbdev     distributed under the License is distributed on an "AS IS" BASIS,
1251c0b2f7Stbbdev     WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1351c0b2f7Stbbdev     See the License for the specific language governing permissions and
1451c0b2f7Stbbdev     limitations under the License.
1551c0b2f7Stbbdev */
1651c0b2f7Stbbdev 
1751c0b2f7Stbbdev #include "common/test.h"
1851c0b2f7Stbbdev 
1951c0b2f7Stbbdev #if (!__TBB_WIN8UI_SUPPORT && !defined(WINAPI_FAMILY) && !__ANDROID__)
2051c0b2f7Stbbdev 
2149e08aacStbbdev #include "oneapi/tbb/task.h"
2249e08aacStbbdev #include "oneapi/tbb/task_group.h"
2351c0b2f7Stbbdev #include <thread>
2451c0b2f7Stbbdev 
2551c0b2f7Stbbdev //! \file conformance_resumable_tasks.cpp
2651c0b2f7Stbbdev //! \brief Test for [resumable_tasks] specification
2751c0b2f7Stbbdev 
2851c0b2f7Stbbdev thread_local bool mLocal = false;
2951c0b2f7Stbbdev 
3051c0b2f7Stbbdev //! Test asynchronous resume
3151c0b2f7Stbbdev //! \brief \ref interface \ref requirement
3251c0b2f7Stbbdev TEST_CASE("Async test") {
3351c0b2f7Stbbdev     CHECK(!mLocal);
3451c0b2f7Stbbdev     mLocal = true;
3551c0b2f7Stbbdev     bool suspend = false, resume = false;
3651c0b2f7Stbbdev     std::thread t;
__anon366fea4d0102(oneapi::tbb::task::suspend_point sp) 3749e08aacStbbdev     oneapi::tbb::task::suspend([&t, &suspend, &resume](oneapi::tbb::task::suspend_point sp) {
3851c0b2f7Stbbdev         suspend = true;
3951c0b2f7Stbbdev         t = std::thread([sp, &resume] {
4051c0b2f7Stbbdev             resume = true;
4149e08aacStbbdev             oneapi::tbb::task::resume(sp);
4251c0b2f7Stbbdev         });
4351c0b2f7Stbbdev     });
4451c0b2f7Stbbdev     CHECK(suspend);
4551c0b2f7Stbbdev     CHECK(resume);
4651c0b2f7Stbbdev     CHECK_MESSAGE(mLocal, "The same thread is expected");
4751c0b2f7Stbbdev     mLocal = false;
4851c0b2f7Stbbdev     t.join();
4951c0b2f7Stbbdev }
5051c0b2f7Stbbdev 
5151c0b2f7Stbbdev //! Test parallel resume
5251c0b2f7Stbbdev //! \brief \ref interface \ref requirement
5351c0b2f7Stbbdev TEST_CASE("Parallel test") {
5451c0b2f7Stbbdev     CHECK(!mLocal);
5551c0b2f7Stbbdev     mLocal = true;
5651c0b2f7Stbbdev     constexpr int N = 100;
5751c0b2f7Stbbdev     std::atomic<int> suspend{}, resume{};
5849e08aacStbbdev     oneapi::tbb::task_group tg;
5951c0b2f7Stbbdev     for (int i = 0; i < N; ++i) {
__anon366fea4d0302null6051c0b2f7Stbbdev         tg.run([&tg, &suspend, &resume] {
6149e08aacStbbdev             oneapi::tbb::task::suspend([&tg, &suspend, &resume](oneapi::tbb::task::suspend_point sp) {
6251c0b2f7Stbbdev                 ++suspend;
6351c0b2f7Stbbdev                 tg.run([sp, &resume] {
6451c0b2f7Stbbdev                     ++resume;
6549e08aacStbbdev                     oneapi::tbb::task::resume(sp);
6651c0b2f7Stbbdev                 });
6751c0b2f7Stbbdev             });
6851c0b2f7Stbbdev         });
6951c0b2f7Stbbdev     }
7051c0b2f7Stbbdev     tg.wait();
7151c0b2f7Stbbdev     CHECK(suspend == N);
7251c0b2f7Stbbdev     CHECK(resume == N);
7351c0b2f7Stbbdev     CHECK_MESSAGE(mLocal, "The same thread is expected");
7451c0b2f7Stbbdev }
7551c0b2f7Stbbdev #endif
76