source:
tests/unified_locking/fast.cfa
@
62006a3
Last change on this file since 62006a3 was 62006a3, checked in by , 4 years ago | |
---|---|
|
|
File size: 955 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(); |
[62006a3] | 24 | uint32_t value = (uint32_t)me; |
[976bc68] | 25 | lock(mo.l); |
26 | { | |
[62006a3] | 27 | uint32_t tsum = mo.sum; |
[976bc68] | 28 | mo.id = me; |
29 | yield(random(5)); | |
30 | if(mo.id != me) sout | "Intruder!"; | |
31 | mo.sum = tsum + value; | |
32 | } | |
33 | unlock(mo.l); | |
34 | return value; | |
35 | } | |
36 | ||
37 | thread LockCheck { | |
[62006a3] | 38 | uint32_t sum; |
[976bc68] | 39 | }; |
40 | ||
41 | void main(LockCheck & this) { | |
42 | this.sum = 0; | |
43 | for(num_times) { | |
44 | trash(); | |
45 | this.sum += cs(); | |
46 | trash(); | |
47 | yield(random(10)); | |
48 | } | |
49 | } | |
50 | ||
51 | int main() { | |
[62006a3] | 52 | uint32_t sum = -32; |
[976bc68] | 53 | mo.sum = -32; |
54 | processor p[2]; | |
55 | sout | "Starting"; | |
56 | { | |
57 | LockCheck checkers[13]; | |
58 | for(i;13) { | |
59 | sum += join(checkers[i]).sum; | |
60 | } | |
61 | } | |
62 | sout | "Done!"; | |
63 | if(sum == mo.sum) sout | "Match!"; | |
64 | else sout | "No Match!" | sum | "vs" | mo.sum; | |
65 | } |
Note: See TracBrowser
for help on using the repository browser.