source: tests/concurrent/coroutineThen.cfa @ dda3e2a

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

Some more work on suspend_then

  • Property mode set to 100644
File size: 1.7 KB
Line 
1#include <fstream.hfa>
2#include <kernel.hfa>
3#include <monitor.hfa>
4#include <thread.hfa>
5#include <time.hfa>
6#include <stdlib.hfa>
7#include <string.h>
8
9#define __kick_rate 150000ul
10#include "long_tests.hfa"
11
12#ifndef PREEMPTION_RATE
13#define PREEMPTION_RATE 10`ms
14#endif
15
16Duration default_preemption() {
17        return PREEMPTION_RATE;
18}
19
20#ifdef TEST_LONG
21static const unsigned long N = 600_000ul;
22#else
23static const unsigned long N = 1_000ul;
24#endif
25
26#if !defined(TEST_FOREVER)
27        static inline void print(const char * const text ) {
28                write( STDERR_FILENO, text, strlen(text) );
29        }
30#else
31        static inline void print(Printer & this, const char * const text ) {}
32#endif
33
34coroutine Coroutine {};
35
36volatile bool done = false;
37Coroutine * volatile the_cor = 0p;
38
39void store(Coroutine & cor) {
40        __atomic_store_n(&the_cor, &cor, __ATOMIC_SEQ_CST);
41}
42
43Coroutine * take(void) {
44        Coroutine * val = 0p;
45        Coroutine * ret = __atomic_exchange_n(&the_cor, val, __ATOMIC_SEQ_CST);
46        assert(!ret || !the_cor);
47        return ret;
48}
49
50void main(Coroutine& this) {
51        suspend();
52        for(int i = 0; TEST(i < N); i++) {
53
54                print("C - Suspending");
55                void publish() {
56                        print("C - Publishing");
57                        assert(!the_cor);
58                        store( this );
59                }
60                suspend_then(publish);
61                assert(!the_cor);
62                print("Coroutine 2");
63                KICK_WATCHDOG;
64                yield();
65        }
66        done = true;
67        suspend();
68}
69
70thread Thread {};
71void main(Thread & this) {
72        Coroutine * mine = 0p;
73        while(!done) {
74                yield();
75
76                mine = take();
77                if(!mine) continue;
78
79                print("T - took");
80                resume(*mine);
81                print("T - back");
82        }
83}
84
85
86int main(int argc, char* argv[]) {
87        processor p[2];
88        Coroutine c;
89        resume(c); // Prime the coroutine to avoid one of the threads being its starter
90        the_cor = &c;
91        {
92                Thread t[2];
93        }
94}
Note: See TracBrowser for help on using the repository browser.