diff --git a/modules/channel/chain/dap_stream_ch_chain.c b/modules/channel/chain/dap_stream_ch_chain.c index c791dc5e2427dd7248ef4e917d3e41a72acb6036..bc4ba71798b8bfa98f4f21a563cf50822c1141c7 100644 --- a/modules/channel/chain/dap_stream_ch_chain.c +++ b/modules/channel/chain/dap_stream_ch_chain.c @@ -1405,6 +1405,38 @@ void s_stream_ch_packet_in(dap_stream_ch_t* a_ch, void* a_arg) } +/** + * @brief dap_stream_ch_chain_go_idle_and_free_list + * @param a_ch_chain + */ +void dap_stream_ch_chain_go_idle_and_free_list ( dap_stream_ch_chain_t * a_ch_chain) +{ + a_ch_chain->state = CHAIN_STATE_IDLE; + if(s_debug_more) + log_it(L_INFO, "Go in CHAIN_STATE_IDLE"); + + // Cleanup after request + memset(&a_ch_chain->request, 0, sizeof(a_ch_chain->request)); + memset(&a_ch_chain->request_hdr, 0, sizeof(a_ch_chain->request_hdr)); + if (a_ch_chain->request_atom_iter && a_ch_chain->request_atom_iter->chain && + a_ch_chain->request_atom_iter->chain->callback_atom_iter_delete) { + a_ch_chain->request_atom_iter->chain->callback_atom_iter_delete(a_ch_chain->request_atom_iter); + a_ch_chain->request_atom_iter = NULL; + } + // free log list + dap_db_log_list_delete(a_ch_chain->request_db_log); + a_ch_chain->request_db_log = NULL; + dap_stream_ch_chain_hash_item_t *l_hash_item = NULL, *l_tmp = NULL; + HASH_ITER(hh, a_ch_chain->remote_gdbs, l_hash_item, l_tmp) { + HASH_DEL(a_ch_chain->remote_gdbs, l_hash_item); + DAP_DELETE(l_hash_item); + } + HASH_ITER(hh, a_ch_chain->remote_atoms, l_hash_item, l_tmp) { + HASH_DEL(a_ch_chain->remote_atoms, l_hash_item); + DAP_DELETE(l_hash_item); + } + a_ch_chain->remote_atoms = a_ch_chain->remote_gdbs = NULL; +} /** * @brief dap_stream_ch_chain_go_idle * @param a_ch_chain @@ -1424,6 +1456,7 @@ void dap_stream_ch_chain_go_idle ( dap_stream_ch_chain_t * a_ch_chain) a_ch_chain->request_atom_iter = NULL; } // free log list +#if 0 dap_db_log_list_delete(a_ch_chain->request_db_log); a_ch_chain->request_db_log = NULL; dap_stream_ch_chain_hash_item_t *l_hash_item = NULL, *l_tmp = NULL; @@ -1436,6 +1469,7 @@ void dap_stream_ch_chain_go_idle ( dap_stream_ch_chain_t * a_ch_chain) DAP_DELETE(l_hash_item); } a_ch_chain->remote_atoms = a_ch_chain->remote_gdbs = NULL; +#endif } /** @@ -1487,7 +1521,7 @@ void s_stream_ch_packet_out(dap_stream_ch_t* a_ch, void* a_arg) &l_ch_chain->request, sizeof(dap_stream_ch_chain_sync_request_t)); if (s_debug_more ) log_it(L_INFO, "Out: DAP_STREAM_CH_CHAIN_PKT_TYPE_UPDATE_GLOBAL_DB_END"); - dap_stream_ch_chain_go_idle(l_ch_chain); + dap_stream_ch_chain_go_idle_and_free_list(l_ch_chain); } } break;