Index: doc/papers/concurrency/examples/ProdCons.cpp
===================================================================
--- doc/papers/concurrency/examples/ProdCons.cpp	(revision 1bb2488f0c626690cd402a7004cd0df0db3e31d2)
+++ doc/papers/concurrency/examples/ProdCons.cpp	(revision ae6b6cf796a0f3fdf820aab4c5ad66768ec6d9cb)
@@ -12,5 +12,9 @@
 struct Cons;
 
-struct Prod {
+struct resumable {
+	virtual resumable * resume() = 0;
+};
+
+struct Prod : public resumable {
 	struct local {
 		Cons * c;
@@ -20,4 +24,5 @@
 	struct promise_type {
 		local _l;
+		resumable * next;
 
 		Prod get_return_object() {
@@ -69,14 +74,7 @@
 	static Prod main();
 
-	auto payment(int money) {
-		_coroutine.promise()._l.money = money;
-		struct ret {
-			int _receipt;
-			bool await_ready() { return false; }
-			void await_suspend(std::experimental::coroutine_handle<>) {}
-			int await_resume() { return _receipt; }
-		};
-		return ret{ _coroutine.promise()._l.receipt };
-	}
+	struct payment_return;
+
+	payment_return payment(int money);
 
 	auto start(int N, Cons & c) {
@@ -84,9 +82,13 @@
 		_coroutine.promise()._l.N = N;
 		_coroutine.promise()._l.receipt = 0;
+	}
+
+	virtual resumable * resume() override final {
 		_coroutine.resume();
-	}
-};
-
-struct Cons {
+		return _coroutine.promise().next;
+	}
+};
+
+struct Cons : public resumable {
 	struct local {
 		Prod * p;
@@ -97,4 +99,5 @@
 	struct promise_type {
 		local _l;
+		resumable * next;
 
 		Cons get_return_object() {
@@ -154,9 +157,12 @@
 		struct ret {
 			int _status;
+			Cons * c;
 			bool await_ready() { return false; }
-			void await_suspend(std::experimental::coroutine_handle<>) {}
+			void await_suspend(std::experimental::coroutine_handle<Prod::promise_type> _coroutine) {
+				_coroutine.promise().next = c;
+			}
 			int await_resume() { return _status; }
 		};
-		return ret{ _coroutine.promise()._l.status };
+		return ret{ _coroutine.promise()._l.status, this };
 	}
 
@@ -164,11 +170,38 @@
 		_coroutine.promise()._l.done = true;
 		struct ret {
+			Cons * c;
+			Prod::promise_type * _promise;
 			bool await_ready() { return false; }
-			void await_suspend(std::experimental::coroutine_handle<>) {}
-			void await_resume() {}
+			void await_suspend(std::experimental::coroutine_handle<Prod::promise_type> _coroutine) {
+				_promise = &_coroutine.promise();
+				_promise->next = c;
+			}
+			void await_resume() {
+				_promise->next = nullptr;
+			}
 		};
-		return ret{};
-	}
-};
+		return ret{this, nullptr};
+	}
+
+	virtual resumable * resume() override final {
+		_coroutine.resume();
+		return _coroutine.promise().next;
+	}
+};
+
+struct Prod::payment_return {
+	int _receipt;
+	Prod * p;
+	bool await_ready() { return false; }
+	void await_suspend(std::experimental::coroutine_handle<Cons::promise_type> _coroutine) {
+		_coroutine.promise().next = p;
+	}
+	int await_resume() { return _receipt; }
+};
+
+Prod::payment_return Prod::payment(int money)  {
+	_coroutine.promise()._l.money = money;
+	return payment_return{ _coroutine.promise()._l.receipt, this };
+}
 
 Prod Prod::main() {
@@ -176,11 +209,11 @@
 	for(int i = 0; i < p.N; i++) {
 		int p1 = random(100), p2 = random(100);
-		std::cout << p1 << " " << p2;
+		std::cout << p1 << " " << p2 << std::endl;
 		int status = co_await p.c->deliver(p1, p2);
-		std::cout << " $" << p.money << std::endl << status;
+		std::cout << " $" << p.money << std::endl << status << std::endl;
 		p.receipt += 1;
 	}
 	co_await p.c->stop();
-	std::cout << "prod stops";
+	std::cout << "prod stops" << std::endl;
 }
 
@@ -189,11 +222,16 @@
 	int money = 1, receipt;
 	for(;!c.done ;) {
-		std::cout << c.p1 << " " << c.p2 << std::endl << " $" << money;
+		std::cout << c.p1 << " " << c.p2 << std::endl;
+		std::cout << " $ " << money << std::endl;
 		c.status += 1;
 		receipt = co_await c.p->payment( money );
-		std::cout << " #" << receipt;
+		std::cout << " # " << receipt << std::endl;
 		money += 1;
 	}
-	std::cout << "const stops";
+	std::cout << "cons stops" << std::endl;
+}
+
+void dispatch(resumable * r) {
+	while((r = r->resume()));
 }
 
@@ -203,3 +241,4 @@
 	srandom( getpid() );
 	prod.start(5, cons);
-}
+	dispatch(&prod);
+}
