From a79a88a29708cce0ea949a308a872589de928ed2 Mon Sep 17 00:00:00 2001 From: "aleksei.voronin" <aleksei.voronin@demlabs.net> Date: Wed, 29 Jul 2020 19:57:08 +0300 Subject: [PATCH] [*] fixed node deadlock on channel closing --- dap-sdk/net/stream/stream/dap_stream.c | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/dap-sdk/net/stream/stream/dap_stream.c b/dap-sdk/net/stream/stream/dap_stream.c index 34cc1b870f..d244dbafba 100644 --- a/dap-sdk/net/stream/stream/dap_stream.c +++ b/dap-sdk/net/stream/stream/dap_stream.c @@ -697,12 +697,15 @@ void stream_dap_delete(dap_client_remote_t* sh, void * arg){ } pthread_mutex_unlock(&s_mutex_keepalive_list); - pthread_rwlock_wrlock(&l_stream->rwlock); - size_t i; - for(i=0;i<l_stream->channel_count; i++) - dap_stream_ch_delete(l_stream->channel[i]); - l_stream->channel_count = 0; + /* Until channel is closed, it may still need l_stream->rwlock, so we can't lock it here yet. + In case of races on stream closing think about making this place more robust; + or forbid locking l_stream->rwlock from inside of channels. */ + for( ;l_stream->channel_count; l_stream->channel_count--){ + dap_stream_ch_delete(l_stream->channel[l_stream->channel_count - 1]); + l_stream->channel[l_stream->channel_count - 1] = NULL; + } + pthread_rwlock_wrlock(&l_stream->rwlock); if(l_stream->session) dap_stream_session_close(l_stream->session->id); l_stream->session = NULL; -- GitLab