diff --git a/dap-sdk/net/core/dap_timerfd.c b/dap-sdk/net/core/dap_timerfd.c index cdda7e26de2c1581684415b72b617c03bae17466..61131a04b4a55b06b5228e12e7360d700c880f14 100644 --- a/dap-sdk/net/core/dap_timerfd.c +++ b/dap-sdk/net/core/dap_timerfd.c @@ -328,6 +328,9 @@ void dap_timerfd_reset(dap_timerfd_t *a_timerfd) */ void dap_timerfd_delete(dap_timerfd_t *a_timerfd) { + #ifdef _WIN32 + DeleteTimerQueueTimer(hTimerQueue, (HANDLE)a_timerfd->th, NULL); + #endif if (a_timerfd->events_socket->worker) dap_events_socket_remove_and_delete_mt(a_timerfd->events_socket->worker, a_timerfd->esocket_uuid); } diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c index 821db99af59892057dd8b0e26bd833ae1fe37e83..325d3ac2bf2b6bcc00c3e92f6d082b666c791c69 100644 --- a/modules/channel/chain/dap_stream_ch_chain.c +++ b/modules/channel/chain/dap_stream_ch_chain.c @@ -639,6 +639,39 @@ static void s_gdb_sync_tsd_worker_callback(dap_worker_t *a_worker, void *a_arg) DAP_DELETE(l_sync_request); } +/** + * @brief + * + * @param net_id + * @param group_name + * @return dap_chain_t* + */ +dap_chain_t *s_chain_get_chain_from_group_name(dap_chain_net_id_t net_id, char *group_name) +{ + dap_chain_t *l_chain; + + if (!group_name) + { + log_it(L_ERROR, "s_chain_get_chain_id_from_group. GDB group name is NULL"); + return NULL; + } + + dap_chain_net_t *l_net = dap_chain_net_by_id(net_id); + + if (!l_net) + return false; + + DL_FOREACH(l_net->pub.chains, l_chain) + { + char *s_chain_group_name = dap_chain_net_get_gdb_group_from_chain(l_chain); + + if (!strcmp(group_name,s_chain_group_name)) + return l_chain; + } + + return NULL; +} + /** * @brief s_gdb_in_pkt_callback * @param a_thread @@ -738,11 +771,18 @@ static bool s_gdb_in_pkt_proc_callback(dap_proc_thread_t *a_thread, void *a_arg) // apply received transaction dap_chain_t *l_chain = dap_chain_find_by_id(l_sync_request->request_hdr.net_id, l_sync_request->request_hdr.chain_id); + + // + // if chain is zero, it can be on of GDB group + // + if (!l_chain) + l_chain = s_chain_get_chain_from_group_name(l_sync_request->request_hdr.net_id, l_obj->group); + if(l_chain) { if(l_chain->callback_add_datums_with_group){ const void * restrict l_store_obj_value = l_store_obj[i].value; l_chain->callback_add_datums_with_group(l_chain, - (dap_chain_datum_t** restrict) l_store_obj_value, 1, + (dap_chain_datum_t** restrict) &l_store_obj_value, 1, l_store_obj[i].group); } } diff --git a/modules/net/dap_chain_node_client.c b/modules/net/dap_chain_node_client.c index f080e754f8dc28ff61461c44873fae1c0dcb11ad..b15bf29deb0ae6b92239eb2c4edf12a135b3223d 100644 --- a/modules/net/dap_chain_node_client.c +++ b/modules/net/dap_chain_node_client.c @@ -501,13 +501,17 @@ static void s_ch_chain_callback_notify_packet_in(dap_stream_ch_chain_t* a_ch_cha if (dap_chain_net_get_target_state(l_net) == NET_STATE_ONLINE) { dap_timerfd_reset(l_node_client->sync_timer); dap_chain_net_set_state(l_net, NET_STATE_ONLINE); - } else if (!l_have_waiting) + } + else if (!l_have_waiting) + { + #ifndef _WIN32 + pthread_cond_broadcast(&l_node_client->wait_cond); + #else + SetEvent( l_node_client->wait_cond ); + #endif + // l_node_client object is not presented after dap_chain_net_state_go_to with NET_STATE_OFFLINE dap_chain_net_state_go_to(l_net, NET_STATE_OFFLINE); -#ifndef _WIN32 - pthread_cond_broadcast(&l_node_client->wait_cond); -#else - SetEvent( l_node_client->wait_cond ); -#endif + } } } break; default: break; @@ -790,6 +794,10 @@ void dap_chain_node_client_close(dap_chain_node_client_t *a_client) dap_chain_node_client_handle_t * l_client_found = NULL; HASH_FIND(hh,s_clients,&a_client->uuid,sizeof(a_client->uuid),l_client_found); if (l_client_found) { + + if (l_client_found->client->sync_timer) + dap_timerfd_delete(l_client_found->client->sync_timer); + HASH_DEL(s_clients,l_client_found); DAP_DELETE(l_client_found); if (a_client->callbacks.delete) diff --git a/modules/net/include/dap_chain_net.h b/modules/net/include/dap_chain_net.h index a9701a173791a6313f2c3404764e50bf1fd6aa2f..07468926d7e8cd60abed197cd5e2b1d6ac173af0 100644 --- a/modules/net/include/dap_chain_net.h +++ b/modules/net/include/dap_chain_net.h @@ -169,6 +169,15 @@ DAP_STATIC_INLINE char * dap_chain_net_get_gdb_group_mempool(dap_chain_t * l_cha return NULL; } +DAP_STATIC_INLINE char * dap_chain_net_get_gdb_group_from_chain(dap_chain_t * l_chain) +{ + dap_chain_net_t * l_net = l_chain ? dap_chain_net_by_id(l_chain->net_id) : NULL; + if ( l_net ) + return dap_strdup_printf( "chain-gdb.%s.chain-%016llX",l_net->pub.name, l_chain->id.uint64); + + return NULL; +} + dap_chain_t * dap_chain_net_get_chain_by_chain_type(dap_chain_net_t * l_net, dap_chain_type_t a_datum_type); char * dap_chain_net_get_gdb_group_mempool_by_chain_type(dap_chain_net_t * l_net, dap_chain_type_t a_datum_type); dap_chain_net_t **dap_chain_net_list(uint16_t *a_size);