@@ -412,19 +412,28 @@ static bool s_validate_event_loop(struct aws_event_loop *event_loop) {
412412 return event_loop && event_loop -> vtable && event_loop -> impl_data ;
413413}
414414
415- static void s_set_event_loop (struct aws_socket * aws_socket , struct aws_event_loop * event_loop ) {
415+ static int s_set_event_loop (struct aws_socket * aws_socket , struct aws_event_loop * event_loop ) {
416416 aws_socket -> event_loop = event_loop ;
417417 struct nw_socket * nw_socket = aws_socket -> impl ;
418418 // Never re-assign an event loop
419419 AWS_FATAL_ASSERT (nw_socket -> event_loop == NULL );
420- nw_socket -> event_loop = event_loop ;
421420
421+ // Acquire the event loop group from the event loop. The event loop group will be released when the socket is
422+ // destroyed.
423+ if (!aws_event_loop_group_acquire_from_event_loop (event_loop )) {
424+ AWS_LOGF_ERROR (
425+ AWS_LS_IO_SOCKET ,
426+ "id=%p nw_socket=%p: failed to acquire event loop group." ,
427+ (void * )aws_socket ,
428+ (void * )nw_socket );
429+ return AWS_OP_ERR ;
430+ }
431+
432+ nw_socket -> event_loop = event_loop ;
422433 AWS_LOGF_DEBUG (
423- AWS_LS_IO_SOCKET ,
424- "id=%p nw_socket=%p: s_set_event_loop: socket acquire event loop group." ,
425- (void * )aws_socket ,
426- (void * )nw_socket );
427- aws_event_loop_group_acquire (get_base_event_loop_group (event_loop ));
434+ AWS_LS_IO_SOCKET , "id=%p nw_socket=%p: nw_socket set event loop." , (void * )aws_socket , (void * )nw_socket );
435+
436+ return AWS_OP_SUCCESS ;
428437}
429438
430439static void s_release_event_loop (struct nw_socket * nw_socket ) {
@@ -433,7 +442,7 @@ static void s_release_event_loop(struct nw_socket *nw_socket) {
433442 AWS_LS_IO_SOCKET , "nw_socket=%p: s_release_event_loop: socket has not event loop." , (void * )nw_socket );
434443 return ;
435444 }
436- aws_event_loop_group_release ( get_base_event_loop_group ( nw_socket -> event_loop ) );
445+ aws_event_loop_group_release_from_event_loop ( nw_socket -> event_loop );
437446 AWS_LOGF_DEBUG (
438447 AWS_LS_IO_SOCKET , "nw_socket=%p: s_release_event_loop: socket release event loop group." , (void * )nw_socket );
439448 nw_socket -> event_loop = NULL ;
@@ -1798,7 +1807,10 @@ static int s_socket_connect_fn(struct aws_socket *socket, struct aws_socket_conn
17981807 }
17991808
18001809 /* event_loop must be set prior to setup of socket parameters. */
1801- s_set_event_loop (socket , event_loop );
1810+ if (s_set_event_loop (socket , event_loop )) {
1811+ goto error ;
1812+ }
1813+
18021814 if (s_setup_socket_params (nw_socket , & socket -> options )) {
18031815 goto error ;
18041816 }
@@ -2316,15 +2328,25 @@ static int s_socket_start_accept_fn(
23162328 return aws_raise_error (AWS_IO_EVENT_LOOP_ALREADY_ASSIGNED );
23172329 }
23182330
2331+ if (s_set_event_loop (socket , accept_loop )) {
2332+ AWS_LOGF_ERROR (
2333+ AWS_LS_IO_SOCKET ,
2334+ "id=%p handle=%p: failed to set event loop %p, invalid event loop. It is most likely the event loop does "
2335+ "not has a parent event loop group." ,
2336+ (void * )socket ,
2337+ socket -> io_handle .data .handle ,
2338+ (void * )accept_loop );
2339+ s_unlock_socket_synced_data (nw_socket );
2340+ return aws_raise_error (AWS_IO_SOCKET_INVALID_OPTIONS );
2341+ }
2342+
23192343 aws_event_loop_connect_handle_to_io_completion_port (accept_loop , & socket -> io_handle );
23202344 socket -> accept_result_fn = options .on_accept_result ;
23212345 socket -> connect_accept_user_data = options .on_accept_result_user_data ;
23222346
23232347 nw_socket -> on_accept_started_fn = options .on_accept_start ;
23242348 nw_socket -> listen_accept_started_user_data = options .on_accept_start_user_data ;
23252349
2326- s_set_event_loop (socket , accept_loop );
2327-
23282350 nw_listener_set_state_changed_handler (
23292351 socket -> io_handle .data .handle , ^(nw_listener_state_t state , nw_error_t error ) {
23302352 s_handle_listener_state_changed_fn (nw_socket , state , error );
@@ -2433,9 +2455,20 @@ static int s_socket_assign_to_event_loop_fn(struct aws_socket *socket, struct aw
24332455 socket -> io_handle .data .handle ,
24342456 (void * )event_loop );
24352457
2436- if (aws_event_loop_connect_handle_to_io_completion_port (event_loop , & socket -> io_handle )) {
2458+ if (s_set_event_loop (socket , event_loop )) {
2459+ AWS_LOGF_ERROR (
2460+ AWS_LS_IO_SOCKET ,
2461+ "id=%p handle=%p: assigning event loop %p failed. Invalid event loop. It is likely the event loop "
2462+ "does not has a parent event loop group." ,
2463+ (void * )socket ,
2464+ socket -> io_handle .data .handle ,
2465+ (void * )event_loop );
2466+ aws_raise_error (AWS_IO_SOCKET_INVALID_OPTIONS );
2467+ return AWS_IO_SOCKET_INVALID_OPTIONS ;
2468+ }
24372469
2438- AWS_LOGF_DEBUG (
2470+ if (aws_event_loop_connect_handle_to_io_completion_port (event_loop , & socket -> io_handle )) {
2471+ AWS_LOGF_ERROR (
24392472 AWS_LS_IO_SOCKET ,
24402473 "id=%p handle=%p: assigning event loop %p failed" ,
24412474 (void * )socket ,
@@ -2444,7 +2477,6 @@ static int s_socket_assign_to_event_loop_fn(struct aws_socket *socket, struct aw
24442477 return AWS_OP_ERR ;
24452478 }
24462479
2447- s_set_event_loop (socket , event_loop );
24482480 nw_connection_start (socket -> io_handle .data .handle );
24492481 return AWS_OP_SUCCESS ;
24502482 }
0 commit comments