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