diff --git a/source/connection_manager.c b/source/connection_manager.c index 06007005..6eda75b5 100644 --- a/source/connection_manager.c +++ b/source/connection_manager.c @@ -740,6 +740,8 @@ static void s_aws_http_connection_manager_finish_destroy(struct aws_http_connect aws_mem_release(manager->allocator, manager->cull_task); } + aws_event_loop_group_release_from_event_loop(manager->cull_event_loop); + aws_mutex_clean_up(&manager->lock); aws_client_bootstrap_release(manager->bootstrap); @@ -852,6 +854,8 @@ static void s_schedule_culling(struct aws_http_connection_manager *manager) { if (manager->cull_event_loop == NULL) { manager->cull_event_loop = aws_event_loop_group_get_next_loop(manager->bootstrap->event_loop_group); + // Acquire the event loop group to make sure it doesn't get destroyed while we are using the event loop. + aws_event_loop_group_acquire_from_event_loop(manager->cull_event_loop); } AWS_FATAL_ASSERT(manager->cull_event_loop != NULL); diff --git a/source/http2_stream_manager.c b/source/http2_stream_manager.c index 9cd9a952..96e90586 100644 --- a/source/http2_stream_manager.c +++ b/source/http2_stream_manager.c @@ -295,6 +295,7 @@ static void s_finish_pending_stream_acquisitions_task(struct aws_task *task, voi stream_manager, &pending_stream_acquisitions, AWS_ERROR_HTTP_STREAM_MANAGER_SHUTTING_DOWN); aws_mem_release(stream_manager->allocator, task); s_aws_http2_stream_manager_execute_transaction(&work); + aws_event_loop_group_release_from_event_loop(stream_manager->finish_pending_stream_acquisitions_task_event_loop); } /* helper function for building the transaction: how many new connections we should request */ @@ -379,6 +380,10 @@ static void s_aws_http2_stream_manager_build_transaction_synced(struct aws_http2 /* schedule a task to finish the pending acquisitions if there doesn't have one and needed */ stream_manager->finish_pending_stream_acquisitions_task_event_loop = aws_event_loop_group_get_next_loop(stream_manager->bootstrap->event_loop_group); + /* Acquire a refcount for the task , released when task finished + * s_finish_pending_stream_acquisitions_task */ + aws_event_loop_group_acquire_from_event_loop( + stream_manager->finish_pending_stream_acquisitions_task_event_loop); struct aws_task *finish_pending_stream_acquisitions_task = aws_mem_calloc(stream_manager->allocator, 1, sizeof(struct aws_task)); aws_task_init(