-
-
Notifications
You must be signed in to change notification settings - Fork 168
/
pool.c3
67 lines (58 loc) · 981 Bytes
/
pool.c3
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
module thread_pool_test;
import std::io;
import std::thread;
import std::thread::pool;
def Pool = ThreadPool(<4>);
fn void! init_destroy() @test
{
for (usz i = 0; i < 20; i++)
{
Pool pool;
pool.init()!;
pool.destroy()!;
}
}
fn void! push_destroy() @test
{
for (usz i = 0; i < 20; i++)
{
x = 0;
int y = 20;
Pool pool;
pool.init()!;
defer pool.destroy()!!;
work_done.lock()!!;
pool.push(&do_work, &y)!;
work_done.lock()!!;
assert(x == y, "%d: %d != %d", i, x, y);
work_done.unlock()!!;
}
}
fn void! push_stop() @test
{
for (usz i = 0; i < 20; i++)
{
x = 0;
int y = 20;
Pool pool;
pool.init()!;
work_done.lock()!!;
pool.push(&do_work, &y)!;
pool.stop_and_destroy()!!;
assert(x == y, "%d: %d != %d", i, x, y);
}
}
int x;
Mutex work_done;
fn void startup() @init {
work_done.init()!!;
}
fn void shutdown() @finalizer {
work_done.destroy()!!;
}
fn int do_work(void* arg)
{
x = *(int*)arg;
work_done.unlock()!!;
return 0;
}