-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathtest_monitor.cc
129 lines (128 loc) · 2.51 KB
/
test_monitor.cc
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
#include "thread.h"
#include "extension.h"
#include "extension.cc"
#include <functional>
int main(int argc, char* argv[])
{
t_engine<t_type>::t_options options;
if (argc > 1) std::sscanf(argv[1], "%zu", &options.v_collector__threshold);
options.v_verbose = true;
t_engine_with_threads engine(options);
return [&]() RECYCLONE__NOINLINE
{
auto RECYCLONE__SPILL monitor = f_new<t_object_with_extension>();
auto& mutex = monitor->f_extension()->v_mutex;
auto& condition = monitor->f_extension()->v_condition;
std::function<void()> action = []
{
f_epoch_point<t_type>();
};
::t_thread* RECYCLONE__SPILL worker;
{
f_epoch_region<t_type>([&]
{
mutex.lock();
});
std::unique_lock lock(mutex, std::adopt_lock);
worker = engine.f_start_thread([&]
{
f_epoch_point<t_type>();
f_epoch_region<t_type>([]
{
std::printf("start\n");
});
try {
while (true) {
{
f_epoch_region<t_type>([&]
{
mutex.lock();
});
std::unique_lock lock(mutex, std::adopt_lock);
action = nullptr;
condition.notify_one();
while (!action) {
f_epoch_region<t_type>([&]
{
condition.wait(lock);
});
f_epoch_point<t_type>();
}
}
action();
f_epoch_point<t_type>();
}
#ifdef _MSC_VER
} catch (int) {}
#else
} catch (std::nullptr_t) {}
#endif
f_epoch_region<t_type>([]
{
std::printf("exit\n");
});
});
while (action) {
f_epoch_region<t_type>([&]
{
condition.wait(lock);
});
f_epoch_point<t_type>();
}
}
auto send = [&](auto x)
{
f_epoch_point<t_type>();
f_epoch_region<t_type>([&]
{
mutex.lock();
});
std::unique_lock lock(mutex, std::adopt_lock);
action = x;
condition.notify_one();
while (action) {
f_epoch_region<t_type>([&]
{
condition.wait(lock);
});
f_epoch_point<t_type>();
}
};
auto log = ""s;
send([&]
{
f_epoch_point<t_type>();
log += "Hello, ";
});
send([&]
{
f_epoch_point<t_type>();
log += "World.";
});
{
f_epoch_region<t_type>([&]
{
mutex.lock();
});
std::unique_lock lock(mutex, std::adopt_lock);
action = []
{
f_epoch_point<t_type>();
#ifdef _MSC_VER
throw 0;
#else
throw nullptr;
#endif
};
condition.notify_one();
}
engine.f_join(worker);
f_epoch_region<t_type>([&]
{
std::printf("%s\n", log.c_str());
});
assert(log == "Hello, World.");
engine.f_join_foregrounds();
return 0;
}();
}