source: tests/concurrent/park/force_preempt.cfa@ f90d10f

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

Threads in debug now keep track of last function to park/unpark it

  • Property mode set to 100644
File size: 1.1 KB
Line 
1#include <thread.hfa>
2#include <fstream.hfa>
3
4volatile int global = 0;
5
6thread Poller {};
7void main(Poller & this) {
8 while(true) {
9 waitfor( ^?{} : this ) {
10 break;
11 } or else {
12 global = (global + 1) % 10;
13 yield();
14 }
15 }
16}
17
18thread Waiter {};
19
20volatile int count = 0;
21
22void main(Waiter & this) {
23 // Get a unique id
24 int id = __atomic_fetch_add(&count, 1, __ATOMIC_SEQ_CST);
25 int id_hash = id | (id << 8) | (id << 16) | (id << 24);
26 int mask = 0xCAFEBABA;
27
28 for(int i = 0; i < 5; i++) {
29 assert(mask == 0xCAFEBABA);
30
31 // Unpark this thread, don't force a yield
32 unpark( this __cfaabi_dbg_ctx2 );
33 assert(mask == 0xCAFEBABA);
34
35 // Hash the mask to make sure no one else messes with them
36 mask ^= id_hash;
37 assert(mask == (id_hash ^ 0xCAFEBABA));
38
39 // Force a preemption before the call to park
40 int prev = global;
41 while(prev == global) {}
42
43 // Park this thread,
44 assert(mask == (id_hash ^ 0xCAFEBABA));
45 park( __cfaabi_dbg_ctx );
46 assert(mask == (id_hash ^ 0xCAFEBABA));
47
48 // Reset the hash and recheck it
49 mask ^= id_hash;
50 assert(mask == 0xCAFEBABA);
51 }
52}
53
54int main() {
55 Poller p;
56 {
57 Waiter waiters[5];
58 }
59}
Note: See TracBrowser for help on using the repository browser.