diff --git a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c index b82359d4da3e4d1ef756b44780ecc0fd4dfbfd30..84493f52a7ac06b06e8e009d7fae42a1b010f155 100644 --- a/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c +++ b/modules/consensus/dag-poa/dap_chain_cs_dag_poa.c @@ -645,23 +645,20 @@ static void s_round_event_cs_done(dap_chain_cs_dag_t * a_dag, uint64_t a_round_i dap_chain_cs_dag_poa_t *l_poa = DAP_CHAIN_CS_DAG_POA(a_dag); dap_chain_cs_dag_poa_pvt_t *l_poa_pvt = PVT(l_poa); struct round_timer_arg *l_callback_arg = NULL; - pthread_rwlock_rdlock(&l_poa_pvt->rounds_rwlock); + pthread_rwlock_wrlock(&l_poa_pvt->rounds_rwlock); HASH_FIND(hh, l_poa_pvt->active_rounds, &a_round_id, sizeof(uint64_t), l_callback_arg); - pthread_rwlock_unlock(&l_poa_pvt->rounds_rwlock); if (!l_callback_arg) { l_callback_arg = DAP_NEW_Z(struct round_timer_arg); if (!l_callback_arg) { + pthread_rwlock_unlock(&l_poa_pvt->rounds_rwlock); log_it(L_ERROR, "Memory allocation error in s_round_event_cs_done"); return; } l_callback_arg->dag = a_dag; l_callback_arg->round_id = a_round_id; - // placement in chain by timer - pthread_rwlock_wrlock(&l_poa_pvt->rounds_rwlock); HASH_ADD(hh, l_poa_pvt->active_rounds, round_id, sizeof(uint64_t), l_callback_arg); - pthread_rwlock_unlock(&l_poa_pvt->rounds_rwlock); + // Placement into chain by confirmation timer if (!dap_timerfd_start(PVT(l_poa)->confirmations_timeout * 1000, (dap_timerfd_callback_t)s_callback_round_event_to_chain, l_callback_arg)) { - pthread_rwlock_wrlock(&l_poa_pvt->rounds_rwlock); HASH_DEL(l_poa_pvt->active_rounds, l_callback_arg); pthread_rwlock_unlock(&l_poa_pvt->rounds_rwlock); DAP_DELETE(l_callback_arg); @@ -669,6 +666,9 @@ static void s_round_event_cs_done(dap_chain_cs_dag_t * a_dag, uint64_t a_round_i return; } log_it(L_NOTICE,"Run timer for %d sec for round ID %"DAP_UINT64_FORMAT_U, PVT(l_poa)->confirmations_timeout, a_round_id); + } else { + // Timer for this round has previosuly started + pthread_rwlock_unlock(&l_poa_pvt->rounds_rwlock); } }