MIRROR: javascript for ๐Ÿœ's, a tiny runtime with big ambitions
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

migrate coro to a linked list

+31 -5
+2
include/sugar.h
··· 59 59 ant_value_t async_promise; 60 60 61 61 struct coroutine *active_parent; 62 + struct coroutine *active_prev; 63 + 62 64 struct coroutine *prev; 63 65 struct coroutine *next; 64 66
+6
src/modules/generator.c
··· 361 361 coroutine_t *saved_active = js->active_async_coro; 362 362 363 363 coro->active_parent = saved_active; 364 + coro->active_prev = NULL; 365 + 366 + if (saved_active) saved_active->active_prev = coro; 364 367 js->active_async_coro = coro; 365 368 coroutine_hold(coro, CORO_HOLD_ACTIVE); 366 369 ··· 382 385 383 386 GC_ROOT_PIN(js, result); 384 387 js->active_async_coro = saved_active; 388 + if (saved_active) saved_active->active_prev = NULL; 389 + 385 390 coro->active_parent = NULL; 391 + coro->active_prev = NULL; 386 392 coroutine_unhold(coro, CORO_HOLD_ACTIVE); 387 393 388 394 if (is_err(result)) {
+9 -3
src/silver/ops/async.h
··· 103 103 static inline void sv_async_link_activation(ant_t *js, coroutine_t *coro) { 104 104 if (!js || !coro) return; 105 105 coro->active_parent = js->active_async_coro; 106 + coro->active_prev = NULL; 107 + 108 + if (js->active_async_coro) js->active_async_coro->active_prev = coro; 106 109 js->active_async_coro = coro; 107 110 coroutine_hold(coro, CORO_HOLD_ACTIVE); 108 111 } 109 112 110 113 static inline void sv_async_unlink_activation(ant_t *js, coroutine_t *coro) { 111 114 if (!js || !coro) return; 112 - if (js->active_async_coro == coro) js->active_async_coro = coro->active_parent; 115 + 116 + if (coro->active_prev) coro->active_prev->active_parent = coro->active_parent; 117 + else if (js->active_async_coro == coro) js->active_async_coro = coro->active_parent; 118 + if (coro->active_parent) coro->active_parent->active_prev = coro->active_prev; 119 + 113 120 coro->active_parent = NULL; 121 + coro->active_prev = NULL; 114 122 coroutine_unhold(coro, CORO_HOLD_ACTIVE); 115 123 } 116 124 ··· 648 656 649 657 return promise; 650 658 } 651 - 652 - 653 659 654 660 static inline sv_await_result_t sv_await_value(sv_vm_t *vm, ant_t *js, ant_value_t value) { 655 661 sv_await_result_t out = {
+14 -2
src/sugar.c
··· 199 199 coro->sv_vm->suspended_resume_pending = true; 200 200 201 201 coro->active_parent = js->active_async_coro; 202 + coro->active_prev = NULL; 203 + if (js->active_async_coro) js->active_async_coro->active_prev = coro; 204 + 202 205 js->active_async_coro = coro; 203 206 coroutine_hold(coro, CORO_HOLD_ACTIVE); 204 207 ant_value_t result = sv_resume_suspended(coro->sv_vm); 205 208 206 209 coro->is_settled = false; 207 210 if (coro->sv_vm->suspended) { 208 - js->active_async_coro = coro->active_parent; 211 + if (coro->active_prev) coro->active_prev->active_parent = coro->active_parent; 212 + else if (js->active_async_coro == coro) js->active_async_coro = coro->active_parent; 213 + if (coro->active_parent) coro->active_parent->active_prev = coro->active_prev; 214 + 209 215 coro->active_parent = NULL; 216 + coro->active_prev = NULL; 210 217 coroutine_unhold(coro, CORO_HOLD_ACTIVE); 211 218 if (generator_resume_pending_request(js, coro, result)) return; 212 219 coroutine_release(coro); 220 + 213 221 return; 214 222 } 215 223 216 - js->active_async_coro = coro->active_parent; 224 + if (coro->active_prev) coro->active_prev->active_parent = coro->active_parent; 225 + else if (js->active_async_coro == coro) js->active_async_coro = coro->active_parent; 226 + if (coro->active_parent) coro->active_parent->active_prev = coro->active_prev; 227 + 217 228 coro->active_parent = NULL; 229 + coro->active_prev = NULL; 218 230 coroutine_unhold(coro, CORO_HOLD_ACTIVE); 219 231 220 232 if (generator_resume_pending_request(js, coro, result)) {