mirror of https://github.com/janet-lang/janet
Proper locking on select.
This commit is contained in:
parent
d998f24d26
commit
9d5cc5c11f
|
@ -974,23 +974,30 @@ JANET_CORE_FN(cfun_channel_choice,
|
||||||
JanetChannel *chan = janet_getchannel(data, 0);
|
JanetChannel *chan = janet_getchannel(data, 0);
|
||||||
janet_chan_lock(chan);
|
janet_chan_lock(chan);
|
||||||
if (chan->closed) {
|
if (chan->closed) {
|
||||||
|
janet_chan_unlock(chan);
|
||||||
return make_close_result(chan);
|
return make_close_result(chan);
|
||||||
}
|
}
|
||||||
if (janet_q_count(&chan->items) < chan->limit) {
|
if (janet_q_count(&chan->items) < chan->limit) {
|
||||||
|
janet_chan_unlock(chan);
|
||||||
janet_channel_push(chan, data[1], 1);
|
janet_channel_push(chan, data[1], 1);
|
||||||
return make_write_result(chan);
|
return make_write_result(chan);
|
||||||
}
|
}
|
||||||
|
janet_chan_unlock(chan);
|
||||||
} else {
|
} else {
|
||||||
/* Read */
|
/* Read */
|
||||||
JanetChannel *chan = janet_getchannel(argv, i);
|
JanetChannel *chan = janet_getchannel(argv, i);
|
||||||
|
janet_chan_lock(chan);
|
||||||
if (chan->closed) {
|
if (chan->closed) {
|
||||||
|
janet_chan_unlock(chan);
|
||||||
return make_close_result(chan);
|
return make_close_result(chan);
|
||||||
}
|
}
|
||||||
if (chan->items.head != chan->items.tail) {
|
if (chan->items.head != chan->items.tail) {
|
||||||
Janet item;
|
Janet item;
|
||||||
|
janet_chan_unlock(chan);
|
||||||
janet_channel_pop(chan, &item, 1);
|
janet_channel_pop(chan, &item, 1);
|
||||||
return make_read_result(chan, item);
|
return make_read_result(chan, item);
|
||||||
}
|
}
|
||||||
|
janet_chan_unlock(chan);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -999,13 +1006,11 @@ JANET_CORE_FN(cfun_channel_choice,
|
||||||
if (janet_indexed_view(argv[i], &data, &len) && len == 2) {
|
if (janet_indexed_view(argv[i], &data, &len) && len == 2) {
|
||||||
/* Write */
|
/* Write */
|
||||||
JanetChannel *chan = janet_getchannel(data, 0);
|
JanetChannel *chan = janet_getchannel(data, 0);
|
||||||
if (chan->closed) continue;
|
|
||||||
janet_channel_push(chan, data[1], 1);
|
janet_channel_push(chan, data[1], 1);
|
||||||
} else {
|
} else {
|
||||||
/* Read */
|
/* Read */
|
||||||
Janet item;
|
Janet item;
|
||||||
JanetChannel *chan = janet_getchannel(argv, i);
|
JanetChannel *chan = janet_getchannel(argv, i);
|
||||||
if (chan->closed) continue;
|
|
||||||
janet_channel_pop(chan, &item, 1);
|
janet_channel_pop(chan, &item, 1);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue