source: src/tests/coroutine.c @ fef8293

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 fef8293 was d9c44c3, checked in by Thierry Delisle <tdelisle@…>, 7 years ago

Implemented coroutine for i386 and added coroutines to tests

  • Property mode set to 100644
File size: 1.6 KB
RevLine 
[c15b805]1#include <fstream>
[0e76cf4f]2#include <threads>
[c15b805]3
4struct Fibonacci {
5      coroutine c;
[78b3f52]6      coVtable v;
[c15b805]7      int fn; // used for communication
8};
9
[78b3f52]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 );
[c15b805]16}
17
[78b3f52]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);
[c15b805]27}
28
29void co_main(Fibonacci* this) {
[d9c44c3]30#ifdef MORE_DEBUG
[78b3f52]31      sout | "Starting main of coroutine " | this | endl;
32      sout | "Started from " | this_coroutine(this)->last | endl;
[d9c44c3]33#endif
[c15b805]34      int fn1, fn2;             // retained between resumes
35      this->fn = 0;
36      fn1 = this->fn;
[9129a84]37      suspend();                // return to last resume
[c15b805]38
39      this->fn = 1;
40      fn2 = fn1;
41      fn1 = this->fn;
[9129a84]42      suspend();                // return to last resume
[c15b805]43
44      for ( ;; ) {
45            this->fn = fn1 + fn2;
46            fn2 = fn1;
47            fn1 = this->fn;
[9129a84]48            suspend();  // return to last resume
[c15b805]49      }
50}
51
52int next(Fibonacci* this) {
53      resume(this); // transfer to last suspend
54      return this->fn;
55}
56
[78b3f52]57coroutine* this_coroutine(Fibonacci* this) {
58      return &this->c;
59}
60
61coVtable* vtable(Fibonacci* this) {
62      return &this->v;
63}
64
[9129a84]65int main() {
[d9c44c3]66      Fibonacci f1, f2;
67#ifdef MORE_DEBUG     
68      sout | "User coroutines : " | &f1 | ' ' | &f1 | endl;
69#endif
[c15b805]70      for ( int i = 1; i <= 10; i += 1 ) {
[d9c44c3]71            sout | next(&f1) | ' ' | next(&f2) | endl;
[c15b805]72      }
[9129a84]73
74      return 0;
[0e76cf4f]75}
Note: See TracBrowser for help on using the repository browser.