source: src/tests/coroutine.c@ e958ff8

ADT aaron-thesis arm-eh ast-experimental cleanup-dtors deferred_resn demangler enum forall-pointer-decay jacob/cs343-translation jenkins-sandbox new-ast new-ast-unique-expr new-env no_list persistent-indexer pthread-emulation qualifiedEnum resolv-new with_gc
Last change on this file since e958ff8 was 7fbe450, checked in by Thierry Delisle <tdelisle@…>, 9 years ago

No longer using co_main for coroutines/threads, now simply using main

  • Property mode set to 100644
File size: 1.7 KB
Line 
1#include <fstream>
2#include <coroutines>
3
4struct Fibonacci {
5 int fn; // used for communication
6 coroutine c;
7};
8
9void ?{}(Fibonacci* this) {
10 this->fn = 0;
11}
12
13coroutine* get_coroutine(Fibonacci* this) {
14 return &this->c;
15}
16
17void main(Fibonacci* this) {
18#ifdef MORE_DEBUG
19 sout | "Starting main of coroutine " | this | endl;
20 sout | "Started from " | this->c.last | endl;
21#endif
22 int fn1, fn2; // retained between resumes
23 this->fn = 0;
24 fn1 = this->fn;
25 suspend(); // return to last resume
26
27 this->fn = 1;
28 fn2 = fn1;
29 fn1 = this->fn;
30 suspend(); // return to last resume
31
32 for ( ;; ) {
33 this->fn = fn1 + fn2;
34 fn2 = fn1;
35 fn1 = this->fn;
36 suspend(); // return to last resume
37 }
38}
39
40int next(Fibonacci* this) {
41 resume(this); // transfer to last suspend
42 return this->fn;
43}
44
45int main() {
46 Fibonacci f1, f2;
47#ifdef MORE_DEBUG
48 Fibonacci *pf1 = &f1, *pf2 = &f2;
49 coroutine *cf1 = &f1.c, *cf2 = &f2.c;
50 covptr_t *vf1 = vtable(pf1), *vf2 = vtable(pf2);
51 coroutine *cv1 = get_coroutine(vf1), *cv2 = get_coroutine(vf2);
52 Fibonacci *ov1 = (Fibonacci *)get_object(vf1), *ov2 = (Fibonacci *)get_object(vf2);
53
54 sout | "User coroutines : " | pf1 | ' ' | pf2 | endl;
55 sout | "Coroutine data : " | cf1 | ' ' | cf2 | endl;
56 sout | "Vptr address : " | vf1 | ' ' | vf2 | endl;
57 sout | "Vptr obj data : " | ov1 | ' ' | ov2 | endl;
58 sout | "Vptr cor data : " | cv1 | ' ' | cv2 | endl;
59#endif
60 for ( int i = 1; i <= 10; i += 1 ) {
61 sout | next(&f1) | ' ' | next(&f2) | endl;
62 }
63
64 return 0;
65}
Note: See TracBrowser for help on using the repository browser.