1
0
mirror of https://github.com/janet-lang/janet synced 2024-11-25 01:37:19 +00:00

Hang forever instead of exit early on channel deadlock.

While not technically needed, the behavior is more intuitive and will
prevent people from writing bad scripts.
This commit is contained in:
Calvin Rose 2021-10-20 19:53:29 -05:00
parent 66fbbeb5ec
commit 21a4ab4ec7

View File

@ -830,8 +830,8 @@ static int janet_channel_push(JanetChannel *channel, Janet x, int mode) {
pending.mode = mode ? JANET_CP_MODE_CHOICE_WRITE : JANET_CP_MODE_WRITE; pending.mode = mode ? JANET_CP_MODE_CHOICE_WRITE : JANET_CP_MODE_WRITE;
janet_q_push(&channel->write_pending, &pending, sizeof(pending)); janet_q_push(&channel->write_pending, &pending, sizeof(pending));
janet_chan_unlock(channel); janet_chan_unlock(channel);
janet_ev_inc_refcount();
if (is_threaded) { if (is_threaded) {
janet_ev_inc_refcount();
janet_gcroot(janet_wrap_fiber(pending.fiber)); janet_gcroot(janet_wrap_fiber(pending.fiber));
} }
return 1; return 1;
@ -848,6 +848,7 @@ static int janet_channel_push(JanetChannel *channel, Janet x, int mode) {
msg.argj = x; msg.argj = x;
janet_ev_post_event(vm, janet_thread_chan_cb, msg); janet_ev_post_event(vm, janet_thread_chan_cb, msg);
} else { } else {
janet_ev_dec_refcount();
if (reader.mode == JANET_CP_MODE_CHOICE_READ) { if (reader.mode == JANET_CP_MODE_CHOICE_READ) {
janet_schedule(reader.fiber, make_read_result(channel, x)); janet_schedule(reader.fiber, make_read_result(channel, x));
} else { } else {
@ -880,8 +881,8 @@ static int janet_channel_pop(JanetChannel *channel, Janet *item, int is_choice)
pending.mode = is_choice ? JANET_CP_MODE_CHOICE_READ : JANET_CP_MODE_READ; pending.mode = is_choice ? JANET_CP_MODE_CHOICE_READ : JANET_CP_MODE_READ;
janet_q_push(&channel->read_pending, &pending, sizeof(pending)); janet_q_push(&channel->read_pending, &pending, sizeof(pending));
janet_chan_unlock(channel); janet_chan_unlock(channel);
janet_ev_inc_refcount();
if (is_threaded) { if (is_threaded) {
janet_ev_inc_refcount();
janet_gcroot(janet_wrap_fiber(pending.fiber)); janet_gcroot(janet_wrap_fiber(pending.fiber));
} }
return 0; return 0;
@ -899,6 +900,7 @@ static int janet_channel_pop(JanetChannel *channel, Janet *item, int is_choice)
msg.argj = janet_wrap_nil(); msg.argj = janet_wrap_nil();
janet_ev_post_event(vm, janet_thread_chan_cb, msg); janet_ev_post_event(vm, janet_thread_chan_cb, msg);
} else { } else {
janet_ev_dec_refcount();
if (writer.mode == JANET_CP_MODE_CHOICE_WRITE) { if (writer.mode == JANET_CP_MODE_CHOICE_WRITE) {
janet_schedule(writer.fiber, make_write_result(channel)); janet_schedule(writer.fiber, make_write_result(channel));
} else { } else {
@ -1102,6 +1104,7 @@ JANET_CORE_FN(cfun_channel_close,
msg.argj = janet_wrap_nil(); msg.argj = janet_wrap_nil();
janet_ev_post_event(vm, janet_thread_chan_cb, msg); janet_ev_post_event(vm, janet_thread_chan_cb, msg);
} else { } else {
janet_ev_dec_refcount();
if (writer.mode == JANET_CP_MODE_CHOICE_WRITE) { if (writer.mode == JANET_CP_MODE_CHOICE_WRITE) {
janet_schedule(writer.fiber, janet_wrap_nil()); janet_schedule(writer.fiber, janet_wrap_nil());
} else { } else {
@ -1121,6 +1124,7 @@ JANET_CORE_FN(cfun_channel_close,
msg.argj = janet_wrap_nil(); msg.argj = janet_wrap_nil();
janet_ev_post_event(vm, janet_thread_chan_cb, msg); janet_ev_post_event(vm, janet_thread_chan_cb, msg);
} else { } else {
janet_ev_dec_refcount();
if (reader.mode == JANET_CP_MODE_CHOICE_READ) { if (reader.mode == JANET_CP_MODE_CHOICE_READ) {
janet_schedule(reader.fiber, janet_wrap_nil()); janet_schedule(reader.fiber, janet_wrap_nil());
} else { } else {
@ -1192,12 +1196,12 @@ JanetFiber *janet_loop1(void) {
/* This is a deadline (for a fiber, not a function call) */ /* This is a deadline (for a fiber, not a function call) */
JanetFiberStatus s = janet_fiber_status(to.curr_fiber); JanetFiberStatus s = janet_fiber_status(to.curr_fiber);
int isFinished = (s == JANET_STATUS_DEAD || int isFinished = (s == JANET_STATUS_DEAD ||
s == JANET_STATUS_ERROR || s == JANET_STATUS_ERROR ||
s == JANET_STATUS_USER0 || s == JANET_STATUS_USER0 ||
s == JANET_STATUS_USER1 || s == JANET_STATUS_USER1 ||
s == JANET_STATUS_USER2 || s == JANET_STATUS_USER2 ||
s == JANET_STATUS_USER3 || s == JANET_STATUS_USER3 ||
s == JANET_STATUS_USER4); s == JANET_STATUS_USER4);
if (!isFinished) { if (!isFinished) {
janet_cancel(to.fiber, janet_cstringv("deadline expired")); janet_cancel(to.fiber, janet_cstringv("deadline expired"));
} }