diff --git a/modules/chain/dap_chain_ch.c b/modules/chain/dap_chain_ch.c
index 709008607c35e57e64df4f5dd51e81db5a1ba866..23466ac02281425a738d1901b45ffc85f483c985 100644
--- a/modules/chain/dap_chain_ch.c
+++ b/modules/chain/dap_chain_ch.c
@@ -399,6 +399,8 @@ static bool s_sync_out_gdb_proc_callback(void *a_arg)
                 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;
                         l_go_wait = true;
                     }
@@ -448,8 +450,6 @@ static bool s_sync_out_gdb_proc_callback(void *a_arg)
     }
     if (!l_go_wait)
         return true;
-    if (atomic_compare_exchange_strong(&l_context->state, &l_cur_state, DAP_CHAIN_CH_STATE_WAITING))
-        return false;
 context_delete:
     dap_worker_exec_callback_on(l_context->worker->worker, s_legacy_sync_context_delete, l_context);
     return false;
@@ -529,6 +529,8 @@ static bool s_sync_out_chains_proc_callback(void *a_arg)
             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;
                     l_go_wait = true;
                 }
@@ -584,8 +586,6 @@ static bool s_sync_out_chains_proc_callback(void *a_arg)
     }
     if (!l_go_wait)
         return true;
-    if (atomic_compare_exchange_strong(&l_context->state, &l_cur_state, DAP_CHAIN_CH_STATE_WAITING))
-        return false;
 context_delete:
     dap_worker_exec_callback_on(l_context->worker->worker, s_legacy_sync_context_delete, l_context);
     return false;