From 1e320eb387d0420347c73a5410b040f2100f6e0f Mon Sep 17 00:00:00 2001 From: "roman.khlopkov" <roman.khlopkov@demlabs.net> Date: Tue, 25 Jun 2024 16:55:40 +0300 Subject: [PATCH] [*] Legacy sync atomic states changing correction --- dap-sdk | 2 +- modules/chain/dap_chain_ch.c | 24 +++++++++++------------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/dap-sdk b/dap-sdk index a26a4b0c76..8b19997fc2 160000 --- a/dap-sdk +++ b/dap-sdk @@ -1 +1 @@ -Subproject commit a26a4b0c76a953a7563c664fb2dec74f122c1aa0 +Subproject commit 8b19997fc272166ab0ed5f4a68d960cb20dbb5fc diff --git a/modules/chain/dap_chain_ch.c b/modules/chain/dap_chain_ch.c index 6c40ab9c3a..5824132b4b 100644 --- a/modules/chain/dap_chain_ch.c +++ b/modules/chain/dap_chain_ch.c @@ -398,12 +398,8 @@ static bool s_sync_out_gdb_proc_callback(void *a_arg) size_t l_cur_size = l_pkt_pack ? l_pkt_pack->data_size : 0; if (l_cur_size + sizeof(dap_global_db_pkt_old_t) + l_pkt->data_size >= DAP_CHAIN_PKT_EXPECT_SIZE) { l_context->enqueued_data_size += l_data_size; - if (!l_go_wait && l_context->enqueued_data_size > DAP_EVENTS_SOCKET_BUF_SIZE / 2) { - if (!atomic_compare_exchange_strong(&l_context->state, &l_cur_state, DAP_CHAIN_CH_STATE_WAITING)) - goto context_delete; - l_context->prev_state = l_cur_state; + if (l_context->enqueued_data_size > DAP_EVENTS_SOCKET_BUF_SIZE / 2) l_go_wait = true; - } dap_chain_ch_pkt_write_mt(l_context->worker, l_context->ch_uuid, l_type, l_context->request_hdr.net_id, l_context->request_hdr.chain_id, l_context->request_hdr.cell_id, l_data, l_data_size, DAP_CHAIN_CH_PKT_VERSION_LEGACY); @@ -450,6 +446,9 @@ static bool s_sync_out_gdb_proc_callback(void *a_arg) } if (!l_go_wait) return true; + l_context->prev_state = l_cur_state; + if (!atomic_compare_exchange_strong(&l_context->state, &l_cur_state, DAP_CHAIN_CH_STATE_WAITING)) + goto context_delete; return false; context_delete: dap_worker_exec_callback_on(l_context->worker->worker, s_legacy_sync_context_delete, l_context); @@ -524,12 +523,8 @@ static bool s_sync_out_chains_proc_callback(void *a_arg) HASH_FIND(hh, l_context->remote_atoms, l_context->atom_iter->cur_hash, sizeof(dap_hash_fast_t), l_hash_item); if (!l_hash_item) { l_context->enqueued_data_size += l_context->atom_iter->cur_size; - if (l_context->enqueued_data_size > DAP_EVENTS_SOCKET_BUF_SIZE / 2) { - if (!atomic_compare_exchange_strong(&l_context->state, &l_cur_state, DAP_CHAIN_CH_STATE_WAITING)) - goto context_delete; - l_context->prev_state = l_cur_state; + if (l_context->enqueued_data_size > DAP_EVENTS_SOCKET_BUF_SIZE / 2) l_go_wait = true; - } dap_chain_ch_pkt_write_mt(l_context->worker, l_context->ch_uuid, DAP_CHAIN_CH_PKT_TYPE_CHAIN_OLD, l_context->request_hdr.net_id, l_context->request_hdr.chain_id, l_context->request_hdr.cell_id, l_context->atom_iter->cur, l_context->atom_iter->cur_size, DAP_CHAIN_CH_PKT_VERSION_LEGACY); @@ -582,6 +577,9 @@ static bool s_sync_out_chains_proc_callback(void *a_arg) } if (!l_go_wait) return true; + l_context->prev_state = l_cur_state; + if (!atomic_compare_exchange_strong(&l_context->state, &l_cur_state, DAP_CHAIN_CH_STATE_WAITING)) + goto context_delete; return false; context_delete: dap_worker_exec_callback_on(l_context->worker->worker, s_legacy_sync_context_delete, l_context); @@ -1668,15 +1666,15 @@ static void s_ch_chain_go_idle(dap_chain_ch_t *a_ch_chain) //} // Legacy if (a_ch_chain->legacy_sync_context) { - dap_chain_ch_state_t l_current_state = atomic_exchange( - &((struct legacy_sync_context *)a_ch_chain->legacy_sync_context)->state, DAP_CHAIN_CH_STATE_IDLE); + dap_chain_ch_state_t l_current_state = atomic_exchange(&a_ch_chain->legacy_sync_context->state, + DAP_CHAIN_CH_STATE_IDLE); if (l_current_state != DAP_CHAIN_CH_STATE_UPDATE_CHAINS && l_current_state != DAP_CHAIN_CH_STATE_SYNC_CHAINS && l_current_state != DAP_CHAIN_CH_STATE_UPDATE_GLOBAL_DB && l_current_state != DAP_CHAIN_CH_STATE_SYNC_GLOBAL_DB && l_current_state != DAP_CHAIN_CH_STATE_IDLE && l_current_state != DAP_CHAIN_CH_STATE_ERROR) - // Context will not be removed from proc thread + // Context will not be destroyed from proc thread s_legacy_sync_context_delete(a_ch_chain->legacy_sync_context); a_ch_chain->legacy_sync_context = NULL; } -- GitLab