source: tests/concurrent/coroutineThen.cfa@ 87701b6

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

Some more work on suspend_then

  • Property mode set to 100644
File size: 1.7 KB
RevLine 
[5b11c25]1#include <fstream.hfa>
2#include <kernel.hfa>
3#include <monitor.hfa>
[f019069]4#include <thread.hfa>
[5b11c25]5#include <time.hfa>
[f019069]6#include <stdlib.hfa>
7#include <string.h>
[5b11c25]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)
[f019069]27 static inline void print(const char * const text ) {
28 write( STDERR_FILENO, text, strlen(text) );
[b9696a8]29 }
[5b11c25]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
[b9696a8]39void store(Coroutine & cor) {
40 __atomic_store_n(&the_cor, &cor, __ATOMIC_SEQ_CST);
[5b11c25]41}
42
[b9696a8]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;
[5b11c25]48}
49
50void main(Coroutine& this) {
[b9696a8]51 suspend();
[5b11c25]52 for(int i = 0; TEST(i < N); i++) {
53
[f019069]54 print("C - Suspending");
[5b11c25]55 void publish() {
[f019069]56 print("C - Publishing");
[5b11c25]57 assert(!the_cor);
[b9696a8]58 store( this );
[5b11c25]59 }
60 suspend_then(publish);
[b9696a8]61 assert(!the_cor);
[f019069]62 print("Coroutine 2");
[5b11c25]63 KICK_WATCHDOG;
64 yield();
65 }
66 done = true;
[b9696a8]67 suspend();
[5b11c25]68}
69
70thread Thread {};
71void main(Thread & this) {
72 Coroutine * mine = 0p;
73 while(!done) {
74 yield();
75
[b9696a8]76 mine = take();
[5b11c25]77 if(!mine) continue;
78
[f019069]79 print("T - took");
[5b11c25]80 resume(*mine);
[f019069]81 print("T - back");
[5b11c25]82 }
83}
84
85
86int main(int argc, char* argv[]) {
87 processor p[2];
88 Coroutine c;
[b9696a8]89 resume(c); // Prime the coroutine to avoid one of the threads being its starter
[5b11c25]90 the_cor = &c;
91 {
92 Thread t[2];
93 }
94}
Note: See TracBrowser for help on using the repository browser.