1
0
mirror of https://github.com/janet-lang/janet synced 2025-07-06 03:52:54 +00:00

added deferred closing of streams after async connect() fails

This commit is contained in:
Ico Doornekamp 2023-05-18 14:09:06 +02:00
parent 8d78fb1f6b
commit c3e28bc924
3 changed files with 21 additions and 3 deletions

View File

@ -1502,6 +1502,10 @@ void janet_loop1_impl(int has_timeout, JanetTimestamp to) {
state = state->_next; state = state->_next;
} }
} }
/* Close the stream if requested and no more listeners are left */
if ((stream->flags & JANET_STREAM_TOCLOSE) && !stream->state) {
janet_stream_close(stream);
}
} }
} }
} }
@ -1656,6 +1660,10 @@ void janet_loop1_impl(int has_timeout, JanetTimestamp timeout) {
janet_unlisten(state, 0); janet_unlisten(state, 0);
state = next_state; state = next_state;
} }
/* Close the stream if requested and no more listeners are left */
if ((stream->flags & JANET_STREAM_TOCLOSE) && !stream->state) {
janet_stream_close(stream);
}
} }
} }
} }
@ -1854,6 +1862,10 @@ void janet_loop1_impl(int has_timeout, JanetTimestamp timeout) {
state = next_state; state = next_state;
} }
/* Close the stream if requested and no more listeners are left */
if ((stream->flags & JANET_STREAM_TOCLOSE) && !stream->state) {
janet_stream_close(stream);
}
} }
} }
} }
@ -1970,6 +1982,11 @@ void janet_loop1_impl(int has_timeout, JanetTimestamp timeout) {
status3 == JANET_ASYNC_STATUS_DONE || status3 == JANET_ASYNC_STATUS_DONE ||
status4 == JANET_ASYNC_STATUS_DONE) status4 == JANET_ASYNC_STATUS_DONE)
janet_unlisten(state, 0); janet_unlisten(state, 0);
/* Close the stream if requested and no more listeners are left */
JanetStream *stream = state->stream;
if ((stream->flags & JANET_STREAM_TOCLOSE) && !stream->state) {
janet_stream_close(stream);
}
} }
} }
@ -2495,11 +2512,11 @@ static JanetAsyncStatus handle_connect(JanetListenerState *s) {
if (res == 0) { if (res == 0) {
janet_schedule(s->fiber, janet_wrap_abstract(s->stream)); janet_schedule(s->fiber, janet_wrap_abstract(s->stream));
} else { } else {
// TODO help needed. janet_stream_close(s->stream); s->stream->flags |= JANET_STREAM_TOCLOSE;
janet_cancel(s->fiber, janet_cstringv(strerror(res))); janet_cancel(s->fiber, janet_cstringv(strerror(res)));
} }
} else { } else {
// TODO help needed. janet_stream_close(s->stream); s->stream->flags |= JANET_STREAM_TOCLOSE;
janet_cancel(s->fiber, janet_ev_lasterr()); janet_cancel(s->fiber, janet_ev_lasterr());
} }
return JANET_ASYNC_STATUS_DONE; return JANET_ASYNC_STATUS_DONE;

View File

@ -480,7 +480,7 @@ JANET_CORE_FN(cfun_net_connect,
/* Wrap socket in abstract type JanetStream */ /* Wrap socket in abstract type JanetStream */
JanetStream *stream = make_stream(sock, JANET_STREAM_READABLE | JANET_STREAM_WRITABLE); JanetStream *stream = make_stream(sock, JANET_STREAM_READABLE | JANET_STREAM_WRITABLE);
/* Set the socket to non-blocking mode */ /* Set up the socket for non-blocking IO before connecting */
janet_net_socknoblock(sock); janet_net_socknoblock(sock);
/* Connect to socket */ /* Connect to socket */

View File

@ -568,6 +568,7 @@ typedef void *JanetAbstract;
#define JANET_STREAM_WRITABLE 0x400 #define JANET_STREAM_WRITABLE 0x400
#define JANET_STREAM_ACCEPTABLE 0x800 #define JANET_STREAM_ACCEPTABLE 0x800
#define JANET_STREAM_UDPSERVER 0x1000 #define JANET_STREAM_UDPSERVER 0x1000
#define JANET_STREAM_TOCLOSE 0x10000
typedef enum { typedef enum {
JANET_ASYNC_EVENT_INIT, JANET_ASYNC_EVENT_INIT,