source:
tests/unified_locking/fast.cfa
@
07033ce
Last change on this file since 07033ce was 07033ce, checked in by , 3 years ago | |
---|---|
|
|
File size: 989 bytes |
Rev | Line | |
---|---|---|
[976bc68] | 1 | #include <fstream.hfa> |
2 | #include <locks.hfa> | |
3 | #include <thread.hfa> | |
4 | ||
5 | const unsigned int num_times = 50; | |
6 | ||
7 | struct MutexObj { | |
8 | fast_lock l; | |
9 | $thread * id; | |
[62006a3] | 10 | uint32_t sum; |
[976bc68] | 11 | }; |
12 | ||
13 | MutexObj mo; | |
14 | ||
15 | void trash() { | |
16 | unsigned t[100]; | |
17 | for(i; 100) { | |
18 | t[i] = 0xDEADBEEF; | |
19 | } | |
20 | } | |
21 | ||
[62006a3] | 22 | uint32_t cs() { |
[976bc68] | 23 | $thread * me = active_thread(); |
[07033ce] | 24 | uint32_t value; |
[976bc68] | 25 | lock(mo.l); |
26 | { | |
[62006a3] | 27 | uint32_t tsum = mo.sum; |
[976bc68] | 28 | mo.id = me; |
29 | yield(random(5)); | |
[07033ce] | 30 | value = ((uint32_t)random()) ^ ((uint32_t)me); |
[976bc68] | 31 | if(mo.id != me) sout | "Intruder!"; |
32 | mo.sum = tsum + value; | |
33 | } | |
34 | unlock(mo.l); | |
35 | return value; | |
36 | } | |
37 | ||
38 | thread LockCheck { | |
[62006a3] | 39 | uint32_t sum; |
[976bc68] | 40 | }; |
41 | ||
42 | void main(LockCheck & this) { | |
43 | this.sum = 0; | |
44 | for(num_times) { | |
45 | trash(); | |
46 | this.sum += cs(); | |
47 | trash(); | |
48 | yield(random(10)); | |
49 | } | |
50 | } | |
51 | ||
52 | int main() { | |
[62006a3] | 53 | uint32_t sum = -32; |
[976bc68] | 54 | mo.sum = -32; |
55 | processor p[2]; | |
56 | sout | "Starting"; | |
57 | { | |
58 | LockCheck checkers[13]; | |
59 | for(i;13) { | |
60 | sum += join(checkers[i]).sum; | |
61 | } | |
62 | } | |
63 | sout | "Done!"; | |
64 | if(sum == mo.sum) sout | "Match!"; | |
65 | else sout | "No Match!" | sum | "vs" | mo.sum; | |
66 | } |
Note: See TracBrowser
for help on using the repository browser.