1 // Copyright 2019 The Marl Authors
2 //
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 //     https://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 #include "marl/blockingcall.h"
16 
17 #include "marl/defer.h"
18 
19 #include "marl_test.h"
20 
21 #include <mutex>
22 
TEST_P(WithBoundScheduler,BlockingCallVoidReturn)23 TEST_P(WithBoundScheduler, BlockingCallVoidReturn) {
24   auto mutex = std::make_shared<std::mutex>();
25   mutex->lock();
26 
27   marl::WaitGroup wg(100);
28   for (int i = 0; i < 100; i++) {
29     marl::schedule([=] {
30       defer(wg.done());
31       marl::blocking_call([=] {
32         mutex->lock();
33         defer(mutex->unlock());
34       });
35     });
36   }
37 
38   mutex->unlock();
39   wg.wait();
40 }
41 
TEST_P(WithBoundScheduler,BlockingCallIntReturn)42 TEST_P(WithBoundScheduler, BlockingCallIntReturn) {
43   auto mutex = std::make_shared<std::mutex>();
44   mutex->lock();
45 
46   marl::WaitGroup wg(100);
47   std::atomic<int> n = {0};
48   for (int i = 0; i < 100; i++) {
49     marl::schedule([=, &n] {
50       defer(wg.done());
51       n += marl::blocking_call([=] {
52         mutex->lock();
53         defer(mutex->unlock());
54         return i;
55       });
56     });
57   }
58 
59   mutex->unlock();
60   wg.wait();
61 
62   ASSERT_EQ(n.load(), 4950);
63 }
64 
TEST_P(WithBoundScheduler,BlockingCallSchedulesTask)65 TEST_P(WithBoundScheduler, BlockingCallSchedulesTask) {
66   marl::WaitGroup wg(1);
67   marl::schedule([=] {
68     marl::blocking_call([=] { marl::schedule([=] { wg.done(); }); });
69   });
70   wg.wait();
71 }
72