From ade84d88e361a3b0f88b24532afc50f9739ef835 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Al=D0=B5x=D0=B0nder=20Lysik=D0=BEv?= <alexander.lysikov@demlabs.net> Date: Wed, 30 Oct 2019 20:31:15 +0500 Subject: [PATCH] added the attempt connect counter --- dap_chain_node_client.c | 23 ++++++++++++++++++++--- 1 file changed, 20 insertions(+), 3 deletions(-) diff --git a/dap_chain_node_client.c b/dap_chain_node_client.c index 4a7e56c..ee356a4 100644 --- a/dap_chain_node_client.c +++ b/dap_chain_node_client.c @@ -127,17 +127,30 @@ static void s_stage_status_callback(dap_client_t *a_client, void *a_arg) */ static void s_stage_status_error_callback(dap_client_t *a_client, void *a_arg) { - (void) a_arg; dap_chain_node_client_t *l_node_client = DAP_CHAIN_NODE_CLIENT(a_client); + // check for last attempt + bool l_is_last_attempt = a_arg ? true : false; + if(l_is_last_attempt){ + pthread_mutex_lock(&l_node_client->wait_mutex); + l_node_client->state = NODE_CLIENT_STATE_DISCONNECTED; + pthread_mutex_unlock(&l_node_client->wait_mutex); +#ifndef _WIN32 + pthread_cond_signal(&l_node_client->wait_cond); +#else + SetEvent( l_node_client->wait_cond ); +#endif + } + if(l_node_client && l_node_client->keep_connection && ((dap_client_get_stage(a_client) != STAGE_STREAM_STREAMING) || (dap_client_get_stage_status(a_client) == STAGE_STATUS_ERROR))) { log_it(L_NOTICE,"Some errors happends, current state is %s but we need to return back to STAGE_STREAM_STREAMING", dap_client_get_stage_str(a_client) ); - pthread_mutex_unlock(&l_node_client->wait_mutex); log_it(L_DEBUG, "Wakeup all who waits"); + pthread_mutex_lock(&l_node_client->wait_mutex); l_node_client->state = NODE_CLIENT_STATE_ERROR; + pthread_mutex_unlock(&l_node_client->wait_mutex); #ifndef _WIN32 pthread_cond_signal(&l_node_client->wait_cond); @@ -505,6 +518,10 @@ int dap_chain_node_client_wait(dap_chain_node_client_t *a_client, int a_waited_s pthread_mutex_unlock(&a_client->wait_mutex); return 0; } + if(a_client->state == NODE_CLIENT_STATE_DISCONNECTED) { + pthread_mutex_unlock(&a_client->wait_mutex); + return -2; + } #ifndef _WIN32 // prepare for signal waiting @@ -530,7 +547,7 @@ int dap_chain_node_client_wait(dap_chain_node_client_t *a_client, int a_waited_s int wait = pthread_cond_timedwait(&a_client->wait_cond, &a_client->wait_mutex, &to); if(wait == 0 && ( a_client->state == a_waited_state || - a_client->state == NODE_CLIENT_STATE_ERROR) + (a_client->state == NODE_CLIENT_STATE_ERROR || a_client->state == NODE_CLIENT_STATE_DISCONNECTED)) ) { ret = a_client->state == a_waited_state ? 0 : -2; break; -- GitLab