summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--include/stc/algo/coroutine.h8
-rw-r--r--misc/examples/generator.c2
2 files changed, 5 insertions, 5 deletions
diff --git a/include/stc/algo/coroutine.h b/include/stc/algo/coroutine.h
index 5607897a..1c849d49 100644
--- a/include/stc/algo/coroutine.h
+++ b/include/stc/algo/coroutine.h
@@ -62,8 +62,8 @@ enum {
cco_state_done = -2,
};
-#define cco_alive(ctx) ((ctx)->cco_state > 0)
-#define cco_done(ctx) ((ctx)->cco_state == cco_state_done)
+#define cco_suspended(ctx) ((ctx)->cco_state > 0)
+#define cco_alive(ctx) ((ctx)->cco_state != cco_state_done)
#define cco_begin(ctx) \
int *_state = &(ctx)->cco_state; \
@@ -91,9 +91,9 @@ enum {
do { \
*_state = __LINE__; \
do { \
- corocall; if (cco_alive(ctx)) return retval; \
+ corocall; if (cco_suspended(ctx)) return retval; \
case __LINE__:; \
- } while (!cco_done(ctx)); \
+ } while (cco_alive(ctx)); \
} while (0)
#define cco_final \
diff --git a/misc/examples/generator.c b/misc/examples/generator.c
index f83ff3f2..2bccc489 100644
--- a/misc/examples/generator.c
+++ b/misc/examples/generator.c
@@ -20,8 +20,8 @@ bool Triple_next(Triple_iter* it) {
for (t->a = 1; t->a < t->c; ++t->a) {
for (t->b = t->a; t->b < t->c; ++t->b) {
if (t->a*t->a + t->b*t->b == t->c*t->c) {
+ if (t->n-- == 0) cco_return;
cco_yield(true);
- if (t->n-- == 1) cco_return;
}
}
}