Skip to content

Commit

Permalink
fix event loop lock
Browse files Browse the repository at this point in the history
  • Loading branch information
xiazhvera committed Jan 21, 2025
1 parent aabba3c commit 5f95766
Show file tree
Hide file tree
Showing 2 changed files with 37 additions and 36 deletions.
8 changes: 3 additions & 5 deletions source/darwin/dispatch_queue_event_loop.c
Original file line number Diff line number Diff line change
Expand Up @@ -441,11 +441,9 @@ static int s_run(struct aws_event_loop *event_loop) {
dispatch_resume(dispatch_loop->dispatch_queue);
dispatch_loop->synced_data.suspended = false;
s_rlock_dispatch_loop_context(dispatch_loop->context);
if (dispatch_loop->context->io_dispatch_loop) {
s_lock_service_entries(dispatch_loop->context);
s_try_schedule_new_iteration(dispatch_loop->context, 0);
s_unlock_service_entries(dispatch_loop->context);
}
s_lock_service_entries(dispatch_loop->context);
s_try_schedule_new_iteration(dispatch_loop->context, 0);
s_unlock_service_entries(dispatch_loop->context);
s_runlock_dispatch_loop_context(dispatch_loop->context);
}
s_unlock_cross_thread_data(dispatch_loop);
Expand Down
65 changes: 34 additions & 31 deletions source/darwin/nw_socket.c
Original file line number Diff line number Diff line change
Expand Up @@ -817,24 +817,26 @@ static void s_schedule_write_fn(
size_t bytes_written,
void *user_data,
aws_socket_on_write_completed_fn *written_fn) {
aws_mutex_lock(&nw_socket->synced_data.lock);
if (nw_socket->synced_data.event_loop) {

struct aws_task *task = aws_mem_calloc(nw_socket->allocator, 1, sizeof(struct aws_task));
struct aws_task *task = aws_mem_calloc(nw_socket->allocator, 1, sizeof(struct aws_task));

struct nw_socket_written_args *args =
aws_mem_calloc(nw_socket->allocator, 1, sizeof(struct nw_socket_written_args));
struct nw_socket_written_args *args =
aws_mem_calloc(nw_socket->allocator, 1, sizeof(struct nw_socket_written_args));

args->nw_socket = nw_socket;
args->allocator = nw_socket->allocator;
args->error_code = error_code;
args->written_fn = written_fn;
args->user_data = user_data;
args->bytes_written = bytes_written;
nw_socket_acquire_internal_ref(nw_socket);
args->nw_socket = nw_socket;
args->allocator = nw_socket->allocator;
args->error_code = error_code;
args->written_fn = written_fn;
args->user_data = user_data;
args->bytes_written = bytes_written;
nw_socket_acquire_internal_ref(nw_socket);

AWS_LOGF_DEBUG(
AWS_LS_IO_SOCKET, "id=%p: nw_socket_acquire_internal_ref: s_process_write_task", (void *)nw_socket);
aws_task_init(task, s_process_write_task, args, "writtenTask");

AWS_LOGF_DEBUG(AWS_LS_IO_SOCKET, "id=%p: nw_socket_acquire_internal_ref: s_process_write_task", (void *)nw_socket);
aws_task_init(task, s_process_write_task, args, "writtenTask");
aws_mutex_lock(&nw_socket->synced_data.lock);
if (nw_socket->synced_data.event_loop) {
aws_event_loop_schedule_task_now(nw_socket->synced_data.event_loop, task);
}

Expand Down Expand Up @@ -988,27 +990,28 @@ static void s_schedule_connection_state_changed_fn(
if (socket->state == CLOSED) {
return;
}
struct aws_task *task = aws_mem_calloc(socket->allocator, 1, sizeof(struct aws_task));
aws_mutex_lock(&nw_socket->synced_data.lock);
if (nw_socket->synced_data.event_loop) {
struct aws_task *task = aws_mem_calloc(socket->allocator, 1, sizeof(struct aws_task));

struct nw_socket *nw_socket = socket->impl;
struct connection_state_change_args *args =
aws_mem_calloc(nw_socket->allocator, 1, sizeof(struct connection_state_change_args));
struct nw_socket *nw_socket = socket->impl;
struct connection_state_change_args *args =
aws_mem_calloc(nw_socket->allocator, 1, sizeof(struct connection_state_change_args));

args->socket = socket;
args->allocator = nw_socket->allocator;
args->error = error ? nw_error_get_error_code(error) : 0;
args->state = state;
args->nw_connection = nw_connection;
args->socket = socket;
args->allocator = nw_socket->allocator;
args->error = error ? nw_error_get_error_code(error) : 0;
args->state = state;
args->nw_connection = nw_connection;

nw_socket_acquire_internal_ref(nw_socket);
nw_socket_acquire_internal_ref(nw_socket);

AWS_LOGF_DEBUG(
AWS_LS_IO_SOCKET,
"id=%p: nw_socket_acquire_internal_ref: s_process_connection_state_change_task",
(void *)nw_socket);
aws_task_init(task, s_process_connection_state_changed_task, args, "ConnectionStateChangedTask");

AWS_LOGF_DEBUG(
AWS_LS_IO_SOCKET,
"id=%p: nw_socket_acquire_internal_ref: s_process_connection_state_change_task",
(void *)nw_socket);
aws_task_init(task, s_process_connection_state_changed_task, args, "ConnectionStateChangedTask");
aws_mutex_lock(&nw_socket->synced_data.lock);
if (nw_socket->synced_data.event_loop) {
aws_event_loop_schedule_task_now(nw_socket->synced_data.event_loop, task);
}

Expand Down

0 comments on commit 5f95766

Please sign in to comment.