diff --git a/main/cdr.c b/main/cdr.c index 7791440a03f2bd08f558dff988a91f7fb6d0ff02..57651aeef54f91738d437ac47634b97f19e8ddb1 100644 --- a/main/cdr.c +++ b/main/cdr.c @@ -3854,10 +3854,12 @@ static int cdr_object_dispatch_all_cb(void *obj, void *arg, int flags) struct cdr_object *cdr = obj; struct cdr_object *it_cdr; + ao2_lock(cdr); for (it_cdr = cdr; it_cdr; it_cdr = it_cdr->next) { cdr_object_transition_state(it_cdr, &finalized_state_fn_table); } cdr_object_dispatch(cdr); + ao2_unlock(cdr); return 0; } @@ -3919,6 +3921,14 @@ static int process_config(int reload) return 0; } +static void cdr_engine_cleanup(void) +{ + channel_subscription = stasis_unsubscribe_and_join(channel_subscription); + bridge_subscription = stasis_unsubscribe_and_join(bridge_subscription); + parking_subscription = stasis_unsubscribe_and_join(parking_subscription); + stasis_message_router_unsubscribe_and_join(stasis_router); +} + static void cdr_engine_shutdown(void) { ao2_callback(active_cdrs_by_channel, OBJ_NODATA, cdr_object_dispatch_all_cb, @@ -3930,10 +3940,6 @@ static void cdr_engine_shutdown(void) ast_free(batch); batch = NULL; - channel_subscription = stasis_unsubscribe_and_join(channel_subscription); - bridge_subscription = stasis_unsubscribe_and_join(bridge_subscription); - parking_subscription = stasis_unsubscribe_and_join(parking_subscription); - stasis_message_router_unsubscribe_and_join(stasis_router); aco_info_destroy(&cfg_info); ao2_global_obj_release(module_configs); @@ -4035,6 +4041,7 @@ int ast_cdr_engine_init(void) } ast_cli_register_multiple(cli_commands, ARRAY_LEN(cli_commands)); + ast_register_cleanup(cdr_engine_cleanup); ast_register_atexit(cdr_engine_shutdown); mod_cfg = ao2_global_obj_ref(module_configs);