Something went wrong. Try again.
javascript for 🐜's, a tiny runtime with big ambitions antjs.org
Something went wrong. Try again.
1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253#include <stdatomic.h>#include <stdlib.h>
#include "loop.h"#include "isolate.h"
static atomic_flag default_loop_claimed = ATOMIC_FLAG_INIT;
bool Ant_Loop_Init(ant_t *js) { if (!atomic_flag_test_and_set(&default_loop_claimed)) js->loop = uv_default_loop(); else { uv_loop_t *loop = malloc(sizeof(*loop)); if (!loop || uv_loop_init(loop) != 0) { free(loop); return false; } js->loop = loop; js->owns_loop = true; } js->loop->data = js; return true;}
void Ant_Loop_Drain(ant_t *js) { uv_loop_t *loop = js->loop; if (!loop) return; for (int pass = 0; pass < 64 && uv_loop_alive(loop); pass++) uv_run(loop, UV_RUN_NOWAIT); if (js->owns_loop) while (loop->active_reqs.count > 0) uv_run(loop, UV_RUN_ONCE);}
static void loop_close_handle(uv_handle_t *handle, void *arg) { if (!uv_is_closing(handle)) uv_close(handle, NULL);}
void Ant_Loop_Destroy(ant_t *js) { uv_loop_t *loop = js->loop; if (!loop) return; loop->data = NULL; js->loop = NULL; if (!js->owns_loop) { atomic_flag_clear(&default_loop_claimed); return; } uv_walk(loop, loop_close_handle, NULL); while (uv_loop_close(loop) == UV_EBUSY) uv_run(loop, UV_RUN_NOWAIT); free(loop); js->owns_loop = false;}