@@ -589,9 +589,10 @@ static void s_sm_connection_release_connection(struct aws_h2_sm_connection *sm_c
589589 AWS_ASSERT (aws_channel_thread_is_callers_thread (aws_http_connection_get_channel (sm_connection -> connection )));
590590
591591 s_lock_synced_data (sm_connection -> stream_manager );
592- /* Remove this connection from the connection tracking list */
592+ /* Remove this connection from the connection tracking list within the lock as altering the list in synced_data. */
593593 aws_linked_list_remove (& sm_connection -> node );
594594 s_unlock_synced_data (sm_connection -> stream_manager );
595+
595596 int error = aws_http_connection_manager_release_connection (
596597 sm_connection -> stream_manager -> connection_manager , sm_connection -> connection );
597598 AWS_ASSERT (!error );
@@ -669,8 +670,8 @@ static void s_sm_on_connection_acquired(struct aws_http_connection *connection,
669670 should_release_connection = true;
670671 } else {
671672 struct aws_h2_sm_connection * sm_connection = s_sm_connection_new (stream_manager , connection );
672- /* Add this connection to the sm_connections tracking list */
673- aws_linked_list_push_back (& stream_manager -> synced_data .sm_connections , & sm_connection -> node );
673+ /* Add this connection to the all_held_connections tracking list */
674+ aws_linked_list_push_back (& stream_manager -> synced_data .all_held_connections , & sm_connection -> node );
674675 bool added = false;
675676 re_error |=
676677 aws_random_access_set_add (& stream_manager -> synced_data .ideal_available_set , sm_connection , & added );
@@ -1087,8 +1088,12 @@ static void s_stream_manager_start_destroy(void *user_data) {
10871088 AWS_ASSERT (stream_manager -> synced_data .internal_refcount_stats [AWS_SMCT_PENDING_ACQUISITION ] == 0 );
10881089
10891090 /* Iterate through all connections and clean up any that remain */
1090- struct aws_linked_list_node * node = aws_linked_list_begin (& stream_manager -> synced_data .sm_connections );
1091- const struct aws_linked_list_node * end_node = aws_linked_list_end (& stream_manager -> synced_data .sm_connections );
1091+ struct aws_linked_list_node * node = aws_linked_list_begin (& stream_manager -> synced_data .all_held_connections );
1092+
1093+ /* No lock needed when stream manager started destroying process. Since there should have no other threads still
1094+ * working. */
1095+ const struct aws_linked_list_node * end_node =
1096+ aws_linked_list_end (& stream_manager -> synced_data .all_held_connections );
10921097 while (node != end_node ) {
10931098 struct aws_h2_sm_connection * sm_connection = AWS_CONTAINER_OF (node , struct aws_h2_sm_connection , node );
10941099 /* Move to next node before potentially destroying current connection */
@@ -1104,16 +1109,13 @@ static void s_stream_manager_start_destroy(void *user_data) {
11041109 -- stream_manager -> synced_data .holding_connections_count ;
11051110 }
11061111
1107- s_lock_synced_data (sm_connection -> stream_manager );
11081112 /* Remove this connection from the connection tracking list */
11091113 aws_linked_list_remove (& sm_connection -> node );
1110- s_unlock_synced_data (sm_connection -> stream_manager );
1111-
11121114 aws_ref_count_release (& sm_connection -> ref_count );
11131115 }
11141116
11151117 /* All connections should be cleaned up now */
1116- AWS_ASSERT (aws_linked_list_empty (& stream_manager -> synced_data .sm_connections ));
1118+ AWS_ASSERT (aws_linked_list_empty (& stream_manager -> synced_data .all_held_connections ));
11171119 AWS_ASSERT (stream_manager -> synced_data .holding_connections_count == 0 );
11181120
11191121 AWS_ASSERT (stream_manager -> connection_manager );
@@ -1160,7 +1162,7 @@ struct aws_http2_stream_manager *aws_http2_stream_manager_new(
11601162 aws_mem_calloc (allocator , 1 , sizeof (struct aws_http2_stream_manager ));
11611163 stream_manager -> allocator = allocator ;
11621164 aws_linked_list_init (& stream_manager -> synced_data .pending_stream_acquisitions );
1163- aws_linked_list_init (& stream_manager -> synced_data .sm_connections );
1165+ aws_linked_list_init (& stream_manager -> synced_data .all_held_connections );
11641166
11651167 if (aws_mutex_init (& stream_manager -> synced_data .lock )) {
11661168 goto on_error ;
0 commit comments