Lely core libraries
2.2.5
coroutine.h
Go to the documentation of this file.
1
37
#ifndef LELY_UTIL_COROUTINE_H_
38
#define LELY_UTIL_COROUTINE_H_
39
40
#ifndef CO_LABEL_TYPE
41
46
#define CO_LABEL_TYPE int
47
#endif
48
53
typedef
struct
{
54
CO_LABEL_TYPE
label;
55
}
co_ctx_t
;
56
58
#define CO_CTX_INIT \
59
{ \
60
0 \
61
}
62
64
#define co_restart(ctx) co_restart__(ctx)
65
#define co_restart__(ctx) ((void)((ctx)->label = 0))
66
68
#define co_is_ready(ctx) co_is_ready__(ctx)
69
#define co_is_ready__(ctx) ((ctx)->label == -1)
70
110
#define co_reenter(ctx) co_reenter__(ctx)
111
#define co_reenter__(ctx) \
112
for (CO_LABEL_TYPE *const _co_label_ = &(ctx)->label; \
113
*_co_label_ != -1; *_co_label_ = -1) \
114
if (0) { \
115
goto _co_continue_; \
116
_co_continue_: \
117
continue; \
118
} else if (0) { \
119
goto _co_break_; \
120
_co_break_: \
121
break; \
122
} else \
123
switch (*_co_label_) \
124
case 0:
125
126
#ifdef __COUNTER__
127
#define co_label__ (__COUNTER__ + 1)
128
#else
129
#define co_label__ __LINE__
130
#endif
131
143
#define co_yield co_yield__(co_label__)
144
// clang-format off
145
#define co_yield__(label) \
146
for (*_co_label_ = (label);;) \
147
if (0) { \
148
case (label): \
149
break; \
150
} else \
151
switch (0) \
152
for (;;) \
153
if (1) \
154
goto _co_continue_; \
155
else \
156
for (;;) \
157
if (1) \
158
goto _co_break_; \
159
else
/* falls through */
\
160
case 0:
161
// clang-format on
162
220
#define co_fork co_fork__(co_label__)
221
#define co_fork__(label) \
222
for (*_co_label_ = -(label)-1;; *_co_label_ = (label)) \
223
if (_co_label_ == (label)) { \
224
case -(label)-1: break; \
225
} else
226
228
#define co_is_parent() (!co_is_child())
229
231
#define co_is_child() (*_co_label_ < -1)
232
233
#endif // !LELY_UTIL_COROUTINE_H_
CO_LABEL_TYPE
#define CO_LABEL_TYPE
The type used to store the label (i.e., program counter) of a stackless coroutine.
Definition:
coroutine.h:46
co_ctx_t
The type holding the context (i.e., program counter) of a stackless coroutine.
Definition:
coroutine.h:53
include
lely
util
coroutine.h
Generated by
1.8.17