Skip to content

Commit

Permalink
WIP add lock for socket state
Browse files Browse the repository at this point in the history
  • Loading branch information
xiazhvera committed Jan 31, 2025
1 parent 9fc5d4a commit d0b3143
Show file tree
Hide file tree
Showing 3 changed files with 158 additions and 27 deletions.
3 changes: 3 additions & 0 deletions include/aws/io/socket.h
Original file line number Diff line number Diff line change
Expand Up @@ -252,6 +252,9 @@ AWS_IO_API int aws_socket_set_shutdown_callback(struct aws_socket *socket, aws_s
* non-event-loop thread or the event-loop the socket is currently assigned to. If called from outside the event-loop,
* this function will block waiting on the socket to close. If this is called from an event-loop thread other than
* the one it's assigned to, it presents the possibility of a deadlock, so don't do it.
*
* If you are using Apple Network Framework, you should always call this function from an event-loop thread regardless
* it is a server or client socket.
*/
AWS_IO_API int aws_socket_close(struct aws_socket *socket);

Expand Down
22 changes: 21 additions & 1 deletion source/channel_bootstrap.c
Original file line number Diff line number Diff line change
Expand Up @@ -1410,14 +1410,34 @@ void s_on_server_connection_result(
s_server_connection_args_release(connection_args);
}

struct channel_listener_cleanup_args {
struct server_connection_args *server_connection_args;
struct aws_allocator *allocator;
};

static void s_shutdown_complete_fn(void *user_data) {
struct channel_listener_cleanup_args *close_args = user_data;

s_server_connection_args_release(close_args->server_connection_args);

aws_mem_release(close_args->allocator, close_args);
}

static void s_listener_destroy_task(struct aws_task *task, void *arg, enum aws_task_status status) {
(void)status;
(void)task;
struct server_connection_args *server_connection_args = arg;

aws_socket_stop_accept(&server_connection_args->listener);

struct aws_allocator *allocator = server_connection_args->listener.allocator;
struct channel_listener_cleanup_args *close_args =
aws_mem_calloc(allocator, 1, sizeof(struct channel_listener_cleanup_args));

close_args->allocator = allocator;
close_args->server_connection_args = server_connection_args;
aws_socket_set_shutdown_callback(&server_connection_args->listener, s_shutdown_complete_fn, close_args);
aws_socket_clean_up(&server_connection_args->listener);
s_server_connection_args_release(server_connection_args);
}

struct aws_socket *aws_server_bootstrap_new_socket_listener(
Expand Down
Loading

0 comments on commit d0b3143

Please sign in to comment.