mirror of
https://github.com/janet-lang/janet
synced 2024-11-17 22:24:49 +00:00
Remove some extra fiber state and use a flag.
This commit is contained in:
parent
fea8242ea7
commit
e8c013a778
@ -258,7 +258,7 @@ void janet_async_end(JanetFiber *fiber) {
|
||||
janet_gcunroot(janet_wrap_abstract(fiber->ev_stream));
|
||||
fiber->ev_callback = NULL;
|
||||
if (fiber->ev_state) {
|
||||
if (!fiber->ev_in_flight) {
|
||||
if (!(fiber->flags & JANET_FIBER_EV_FLAG_IN_FLIGHT)) {
|
||||
janet_free(fiber->ev_state);
|
||||
janet_ev_dec_refcount();
|
||||
}
|
||||
@ -1483,7 +1483,7 @@ void janet_loop1_impl(int has_timeout, JanetTimestamp to) {
|
||||
fiber = stream->write_fiber;
|
||||
}
|
||||
if (fiber != NULL) {
|
||||
fiber->ev_in_flight = 0;
|
||||
fiber->flags &= ~JANET_FIBER_EV_FLAG_IN_FLIGHT;
|
||||
/* System is done with this, we can reused this data */
|
||||
overlapped->InternalHigh = (ULONG_PTR) num_bytes_transfered;
|
||||
fiber->ev_callback(fiber, result ? JANET_ASYNC_EVENT_COMPLETE : JANET_ASYNC_EVENT_FAILED);
|
||||
@ -2232,7 +2232,7 @@ void ev_callback_read(JanetFiber *fiber, JanetAsyncEvent event) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
fiber->ev_in_flight = 1;
|
||||
fiber->flags |= JANET_FIBER_EV_FLAG_IN_FLIGHT;
|
||||
}
|
||||
break;
|
||||
#else
|
||||
@ -2456,7 +2456,7 @@ void ev_callback_write(JanetFiber *fiber, JanetAsyncEvent event) {
|
||||
status = WSASendTo(sock, &state->wbuf, 1, NULL, state->flags, to, tolen, &state->overlapped, NULL);
|
||||
if (status) {
|
||||
if (WSA_IO_PENDING == WSAGetLastError()) {
|
||||
fiber->ev_in_flight = 1;
|
||||
fiber->flags |= JANET_FIBER_EV_FLAG_IN_FLIGHT;
|
||||
} else {
|
||||
janet_cancel(fiber, janet_ev_lasterr());
|
||||
janet_async_end(fiber);
|
||||
@ -2481,7 +2481,7 @@ void ev_callback_write(JanetFiber *fiber, JanetAsyncEvent event) {
|
||||
status = WriteFile(stream->handle, bytes, len, NULL, &state->overlapped);
|
||||
if (!status) {
|
||||
if (ERROR_IO_PENDING == GetLastError()) {
|
||||
fiber->ev_in_flight = 1;
|
||||
fiber->flags |= JANET_FIBER_EV_FLAG_IN_FLIGHT;
|
||||
} else {
|
||||
janet_cancel(fiber, janet_ev_lasterr());
|
||||
janet_async_end(fiber);
|
||||
|
@ -44,7 +44,6 @@ static void fiber_reset(JanetFiber *fiber) {
|
||||
fiber->ev_state = NULL;
|
||||
fiber->ev_stream = NULL;
|
||||
fiber->supervisor_channel = NULL;
|
||||
fiber->ev_in_flight = 0;
|
||||
#endif
|
||||
janet_fiber_set_status(fiber, JANET_STATUS_NEW);
|
||||
}
|
||||
|
@ -59,6 +59,9 @@
|
||||
#define JANET_FIBER_EV_FLAG_CANCELED 0x10000
|
||||
#define JANET_FIBER_EV_FLAG_SUSPENDED 0x20000
|
||||
#define JANET_FIBER_FLAG_ROOT 0x40000
|
||||
#define JANET_FIBER_EV_FLAG_IN_FLIGHT 0x1
|
||||
|
||||
/* used only on windows, should otherwise be unset */
|
||||
|
||||
#define janet_fiber_set_status(f, s) do {\
|
||||
(f)->flags &= ~JANET_FIBER_STATUS_MASK;\
|
||||
|
@ -330,7 +330,7 @@ static void janet_deinit_block(JanetGCObject *mem) {
|
||||
{
|
||||
JanetFiber *f = (JanetFiber *)mem;
|
||||
#ifdef JANET_EV
|
||||
if (f->ev_state && !f->ev_in_flight) {
|
||||
if (f->ev_state && !(f->flags & JANET_FIBER_EV_FLAG_IN_FLIGHT)) {
|
||||
janet_ev_dec_refcount();
|
||||
janet_free(f->ev_state);
|
||||
}
|
||||
|
@ -1053,7 +1053,6 @@ static const uint8_t *unmarshal_one_fiber(
|
||||
fiber->ev_state = NULL;
|
||||
fiber->ev_callback = NULL;
|
||||
fiber->ev_stream = NULL;
|
||||
fiber->ev_in_flight = 0;
|
||||
#endif
|
||||
|
||||
/* Push fiber to seen stack */
|
||||
|
@ -24,6 +24,7 @@
|
||||
#include "features.h"
|
||||
#include <janet.h>
|
||||
#include "util.h"
|
||||
#include "fiber.h"
|
||||
#endif
|
||||
|
||||
#ifdef JANET_NET
|
||||
@ -252,7 +253,7 @@ static int net_sched_accept_impl(NetStateAccept *state, JanetFiber *fiber, Janet
|
||||
int code = WSAGetLastError();
|
||||
if (code == WSA_IO_PENDING) {
|
||||
/* indicates io is happening async */
|
||||
fiber->ev_in_flight = 1;
|
||||
fiber->flags |= JANET_FIBER_EV_FLAG_IN_FLIGHT;
|
||||
return 0;
|
||||
}
|
||||
*err = janet_ev_lasterr();
|
||||
|
@ -927,7 +927,6 @@ struct JanetFiber {
|
||||
JanetStream *ev_stream; /* which stream we are waiting on */
|
||||
void *ev_state; /* Extra data for ev callback state. On windows, first element must be OVERLAPPED. */
|
||||
void *supervisor_channel; /* Channel to push self to when complete */
|
||||
int ev_in_flight; /* If overlapped operation is in flight */
|
||||
#endif
|
||||
};
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user