source: tests/concurrent/multi-monitor.cfa @ ed12051

ADTarm-ehast-experimentalenumforall-pointer-decayjacob/cs343-translationnew-astnew-ast-unique-exprpthread-emulationqualifiedEnum
Last change on this file since ed12051 was 3381ed7, checked in by Thierry Delisle <tdelisle@…>, 5 years ago

Added park/unpark primitives thread and removed BlockInternal?.
Converted monitors to use park unpark.
Intrusive Queue now mark next field when thread is inside queue.
Added several asserts to kernel and monitor.
Added a few tests for park and unpark.

  • Property mode set to 100644
File size: 1.2 KB
Line 
1#include <fstream.hfa>
2#include <kernel.hfa>
3#include <monitor.hfa>
4#include <thread.hfa>
5
6static int global12, global23, global13;
7
8monitor monitor_t {};
9
10static monitor_t m1, m2, m3;
11
12void increment( monitor_t & mutex p1, monitor_t & mutex p2, int & value ) {
13        assert(active_thread() == get_monitor(p1)->owner);
14        assert(active_thread() == get_monitor(p2)->owner);
15        value += 1;
16        assert(active_thread() == get_monitor(p1)->owner);
17        assert(active_thread() == get_monitor(p2)->owner);
18}
19
20thread MyThread {
21        int target;
22};
23
24void ?{}( MyThread & this, int target ) {
25        this.target = target;
26}
27
28void ^?{}( MyThread & mutex this ) {}
29
30void main( MyThread & this ) {
31        for(int i = 0; i < 1000000; i++) {
32                choose(this.target) {
33                        case 0: increment( m1, m2, global12 );
34                        case 1: increment( m2, m3, global23 );
35                        case 2: increment( m1, m3, global13 );
36                }
37        }
38}
39
40forall(dtype T | sized(T) | { void ^?{}(T & mutex); })
41void delete_mutex(T * x) {
42        ^(*x){};
43        free(x);
44}
45
46int main(int argc, char* argv[]) {
47        processor p;
48        {
49                MyThread * f[6];
50                for(int i = 0; i < 6; i++) {
51                        f[i] = new(i % 3);
52                }
53
54                for(int i = 0; i < 6; i++) {
55                        delete_mutex( f[i] );
56                }
57        }
58        sout | global12 | global23 | global13;
59}
Note: See TracBrowser for help on using the repository browser.