source: tests/concurrent/spinaphore.cfa@ 98337569

ADT arm-eh ast-experimental enum forall-pointer-decay jacob/cs343-translation new-ast-unique-expr pthread-emulation qualifiedEnum
Last change on this file since 98337569 was c51124b, checked in by Thierry Delisle <tdelisle@…>, 5 years ago

Added tests for:

  • the "0nary" Semaphore, a.k.a. spinaphore.
  • the mcs lock
  • Property mode set to 100644
File size: 1.9 KB
Line 
1#include <fstream.hfa>
2#include <locks.hfa>
3#include <thread.hfa>
4
5enum { num_blockers = 17, num_unblockers = 13 };
6
7void thrash() {
8 unsigned t[100];
9 for(i; 100) {
10 t[i] = 0xDEADBEEF;
11 }
12}
13
14Semaphore0nary sem;
15
16const unsigned int num_blocks = 1625;
17
18thread Blocker {
19 size_t sum;
20};
21void main(Blocker & this);
22
23Blocker * from_thread($thread * t) {
24 Blocker & nullb = *(Blocker*)0p;
25 $thread & nullt = (thread&)nullb;
26 uintptr_t offset = (uintptr_t)&nullt;
27 uintptr_t address = ((uintptr_t)t) - offset;
28 return (Blocker*)address;
29}
30
31void main(Blocker & this) {
32 $thread * me = active_thread();
33 Blocker * me1 = &this;
34 Blocker * me2 = from_thread(me);
35 if( me1 != me2 ) sout | "Bad casting!" | me1 | "vs" | me2;
36 this.sum = 0;
37 for(num_blocks) {
38 // sout | "b P" | me;
39 P(sem);
40 if(((thread&)this).seqable.next != 0p) sout | "Link not invalidated";
41 // sout | "a P" | me;
42 }
43}
44
45const unsigned int num_unblocks = 2125;
46
47thread Unblocker {
48 size_t sum;
49};
50
51void main(Unblocker & this) {
52 this.sum = 0;
53 unsigned me = (unsigned)&this;
54 for(num_unblocks) {
55 $thread * t = V(sem, false);
56 Blocker * b = from_thread(t);
57 b->sum += me;
58 this.sum += (unsigned)b;
59 unpark(t);
60 // sout | "a V" | t;
61 yield(random(10));
62 }
63}
64
65int main() {
66 size_t usum = 0;
67 size_t bsum = 0;
68
69 if((num_unblocks * num_unblockers) != (num_blocks * num_blockers)) sout | "Mismatched Operations: " | (num_unblocks * num_unblockers) | "vs" | (num_blocks * num_blockers);
70
71 sout | "Starting";
72 {
73 Blocker blockers [num_blockers ];
74 Unblocker unblockers[num_unblockers];
75
76 for(i;num_blockers) {
77 for(num_blocks)
78 usum += (unsigned)&blockers[i];
79 }
80
81 for(i;num_unblockers) {
82 for(num_unblocks)
83 bsum += (unsigned)&unblockers[i];
84 }
85
86 for(i;num_blockers) {
87 bsum -= join(blockers[i]).sum;
88 }
89
90 for(i;num_unblockers) {
91 usum -= join(unblockers[i]).sum;
92 }
93 }
94 sout | "Done!";
95 if(bsum == 0 && usum == 0) sout | "Match!";
96 else sout | "No Match!" | usum | "/" | bsum;
97}
Note: See TracBrowser for help on using the repository browser.