source: src/examples/coroutine.c @ c5cb6130

ADTaaron-thesisarm-ehast-experimentalcleanup-dtorsdeferred_resndemanglerenumforall-pointer-decayjacob/cs343-translationjenkins-sandboxnew-astnew-ast-unique-exprnew-envno_listpersistent-indexerpthread-emulationqualifiedEnumresolv-newwith_gc
Last change on this file since c5cb6130 was 78b3f52, checked in by Thierry Delisle <tdelisle@…>, 8 years ago

Ugly but working coroutines

  • Property mode set to 100644
File size: 1.5 KB
Line 
1#include <fstream>
2#include <threads>
3
4struct Fibonacci {
5      coroutine c;
6      coVtable v;
7      int fn; // used for communication
8};
9
10coroutine* this_coroutine(Fibonacci* this);
11void co_main(Fibonacci* this);
12coVtable* vtable(Fibonacci* this);
13
14void co_main_fib(void* this) {
15      co_main( (Fibonacci*) this );
16}
17
18coroutine* this_coroutine_fib(void* this) {
19      return this_coroutine( (Fibonacci*) this);
20}
21
22void ?{}(Fibonacci* this) {
23      this->fn = 0;
24      this->v.main = co_main_fib;
25      this->v.this_coroutine = this_coroutine_fib;
26      start(this);
27}
28
29void co_main(Fibonacci* this) {
30      sout | "Starting main of coroutine " | this | endl;
31      sout | "Started from " | this_coroutine(this)->last | endl;
32      int fn1, fn2;             // retained between resumes
33      this->fn = 0;
34      fn1 = this->fn;
35      suspend();                // return to last resume
36
37      this->fn = 1;
38      fn2 = fn1;
39      fn1 = this->fn;
40      suspend();                // return to last resume
41
42      for ( ;; ) {
43            this->fn = fn1 + fn2;
44            fn2 = fn1;
45            fn1 = this->fn;
46            suspend();  // return to last resume
47      }
48}
49
50int next(Fibonacci* this) {
51      resume(this); // transfer to last suspend
52      return this->fn;
53}
54
55coroutine* this_coroutine(Fibonacci* this) {
56      return &this->c;
57}
58
59coVtable* vtable(Fibonacci* this) {
60      return &this->v;
61}
62
63int main() {
64      Fibonacci f1;
65      sout | "User coroutine : " | &f1 | endl;
66      for ( int i = 1; i <= 10; i += 1 ) {
67            sout | next(&f1) | endl;
68      }
69
70      return 0;
71}
Note: See TracBrowser for help on using the repository browser.