- File:
-
- 1 edited
-
doc/papers/concurrency/examples/ProdCons.cpp (modified) (10 diffs)
Legend:
- Unmodified
- Added
- Removed
-
doc/papers/concurrency/examples/ProdCons.cpp
rae6b6cf r709e0e0 12 12 struct Cons; 13 13 14 struct resumable { 15 virtual resumable * resume() = 0; 16 }; 17 18 struct Prod : public resumable { 14 struct Prod { 19 15 struct local { 20 16 Cons * c; … … 24 20 struct promise_type { 25 21 local _l; 26 resumable * next;27 22 28 23 Prod get_return_object() { … … 74 69 static Prod main(); 75 70 76 struct payment_return; 77 78 payment_return payment(int money); 71 auto payment(int money) { 72 _coroutine.promise()._l.money = money; 73 struct ret { 74 int _receipt; 75 bool await_ready() { return false; } 76 void await_suspend(std::experimental::coroutine_handle<>) {} 77 int await_resume() { return _receipt; } 78 }; 79 return ret{ _coroutine.promise()._l.receipt }; 80 } 79 81 80 82 auto start(int N, Cons & c) { … … 82 84 _coroutine.promise()._l.N = N; 83 85 _coroutine.promise()._l.receipt = 0; 84 }85 86 virtual resumable * resume() override final {87 86 _coroutine.resume(); 88 return _coroutine.promise().next;89 87 } 90 88 }; 91 89 92 struct Cons : public resumable{90 struct Cons { 93 91 struct local { 94 92 Prod * p; … … 99 97 struct promise_type { 100 98 local _l; 101 resumable * next;102 99 103 100 Cons get_return_object() { … … 157 154 struct ret { 158 155 int _status; 159 Cons * c;160 156 bool await_ready() { return false; } 161 void await_suspend(std::experimental::coroutine_handle<Prod::promise_type> _coroutine) { 162 _coroutine.promise().next = c; 163 } 157 void await_suspend(std::experimental::coroutine_handle<>) {} 164 158 int await_resume() { return _status; } 165 159 }; 166 return ret{ _coroutine.promise()._l.status , this};160 return ret{ _coroutine.promise()._l.status }; 167 161 } 168 162 … … 170 164 _coroutine.promise()._l.done = true; 171 165 struct ret { 172 Cons * c;173 Prod::promise_type * _promise;174 166 bool await_ready() { return false; } 175 void await_suspend(std::experimental::coroutine_handle<Prod::promise_type> _coroutine) { 176 _promise = &_coroutine.promise(); 177 _promise->next = c; 178 } 179 void await_resume() { 180 _promise->next = nullptr; 181 } 167 void await_suspend(std::experimental::coroutine_handle<>) {} 168 void await_resume() {} 182 169 }; 183 return ret{this, nullptr}; 184 } 185 186 virtual resumable * resume() override final { 187 _coroutine.resume(); 188 return _coroutine.promise().next; 170 return ret{}; 189 171 } 190 172 }; 191 192 struct Prod::payment_return {193 int _receipt;194 Prod * p;195 bool await_ready() { return false; }196 void await_suspend(std::experimental::coroutine_handle<Cons::promise_type> _coroutine) {197 _coroutine.promise().next = p;198 }199 int await_resume() { return _receipt; }200 };201 202 Prod::payment_return Prod::payment(int money) {203 _coroutine.promise()._l.money = money;204 return payment_return{ _coroutine.promise()._l.receipt, this };205 }206 173 207 174 Prod Prod::main() { … … 209 176 for(int i = 0; i < p.N; i++) { 210 177 int p1 = random(100), p2 = random(100); 211 std::cout << p1 << " " << p2 << std::endl;178 std::cout << p1 << " " << p2; 212 179 int status = co_await p.c->deliver(p1, p2); 213 std::cout << " $" << p.money << std::endl << status << std::endl;180 std::cout << " $" << p.money << std::endl << status; 214 181 p.receipt += 1; 215 182 } 216 183 co_await p.c->stop(); 217 std::cout << "prod stops" << std::endl;184 std::cout << "prod stops"; 218 185 } 219 186 … … 222 189 int money = 1, receipt; 223 190 for(;!c.done ;) { 224 std::cout << c.p1 << " " << c.p2 << std::endl; 225 std::cout << " $ " << money << std::endl; 191 std::cout << c.p1 << " " << c.p2 << std::endl << " $" << money; 226 192 c.status += 1; 227 193 receipt = co_await c.p->payment( money ); 228 std::cout << " # " << receipt << std::endl;194 std::cout << " #" << receipt; 229 195 money += 1; 230 196 } 231 std::cout << "cons stops" << std::endl; 232 } 233 234 void dispatch(resumable * r) { 235 while((r = r->resume())); 197 std::cout << "const stops"; 236 198 } 237 199 … … 241 203 srandom( getpid() ); 242 204 prod.start(5, cons); 243 dispatch(&prod); 244 } 205 }
Note:
See TracChangeset
for help on using the changeset viewer.