mirror of
				https://github.com/janet-lang/janet
				synced 2025-10-31 07:33:01 +00:00 
			
		
		
		
	added deferred closing of streams after async connect() fails
This commit is contained in:
		| @@ -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; | ||||||
|   | |||||||
| @@ -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 */ | ||||||
|   | |||||||
| @@ -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, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Ico Doornekamp
					Ico Doornekamp