source:
src/tests/coroutine.c
@
fa66f4e
Last change on this file since fa66f4e was d9c44c3, checked in by , 8 years ago | |
---|---|
|
|
File size: 1.6 KB |
Rev | Line | |
---|---|---|
[c15b805] | 1 | #include <fstream> |
[0e76cf4f] | 2 | #include <threads> |
[c15b805] | 3 | |
4 | struct Fibonacci { | |
5 | coroutine c; | |
[78b3f52] | 6 | coVtable v; |
[c15b805] | 7 | int fn; // used for communication |
8 | }; | |
9 | ||
[78b3f52] | 10 | coroutine* this_coroutine(Fibonacci* this); |
11 | void co_main(Fibonacci* this); | |
12 | coVtable* vtable(Fibonacci* this); | |
13 | ||
14 | void co_main_fib(void* this) { | |
15 | co_main( (Fibonacci*) this ); | |
[c15b805] | 16 | } |
17 | ||
[78b3f52] | 18 | coroutine* this_coroutine_fib(void* this) { |
19 | return this_coroutine( (Fibonacci*) this); | |
20 | } | |
21 | ||
22 | void ?{}(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 | ||
29 | void 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 | ||
52 | int next(Fibonacci* this) { | |
53 | resume(this); // transfer to last suspend | |
54 | return this->fn; | |
55 | } | |
56 | ||
[78b3f52] | 57 | coroutine* this_coroutine(Fibonacci* this) { |
58 | return &this->c; | |
59 | } | |
60 | ||
61 | coVtable* vtable(Fibonacci* this) { | |
62 | return &this->v; | |
63 | } | |
64 | ||
[9129a84] | 65 | int 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.