diff options
Diffstat (limited to 'main/cdr.c')
-rw-r--r-- | main/cdr.c | 61 |
1 files changed, 25 insertions, 36 deletions
diff --git a/main/cdr.c b/main/cdr.c index 72766e0ee..df5d99b9b 100644 --- a/main/cdr.c +++ b/main/cdr.c @@ -754,11 +754,7 @@ static void free_variables(struct varshead *headp) */ static void cdr_object_snapshot_copy(struct cdr_object_snapshot *dst, struct cdr_object_snapshot *src) { - if (dst->snapshot) { - ao2_t_ref(dst->snapshot, -1, "release old snapshot during copy"); - } - dst->snapshot = src->snapshot; - ao2_t_ref(dst->snapshot, +1, "bump new snapshot during copy"); + ao2_t_replace(dst->snapshot, src->snapshot, "CDR snapshot copy"); strcpy(dst->userfield, src->userfield); dst->flags = src->flags; copy_variables(&dst->variables, &src->variables); @@ -788,11 +784,11 @@ static int cdr_object_channel_hash_fn(const void *obj, const int flags) const struct cdr_object *cdr; const char *key; - switch (flags & (OBJ_POINTER | OBJ_KEY | OBJ_PARTIAL_KEY)) { - case OBJ_KEY: + switch (flags & OBJ_SEARCH_MASK) { + case OBJ_SEARCH_KEY: key = obj; break; - case OBJ_POINTER: + case OBJ_SEARCH_OBJECT: cdr = obj; key = cdr->uniqueid; break; @@ -813,14 +809,14 @@ static int cdr_object_channel_cmp_fn(void *obj, void *arg, int flags) const char *right_key = arg; int cmp; - switch (flags & (OBJ_POINTER | OBJ_KEY | OBJ_PARTIAL_KEY)) { - case OBJ_POINTER: + switch (flags & OBJ_SEARCH_MASK) { + case OBJ_SEARCH_OBJECT: right_key = right->uniqueid; /* Fall through */ - case OBJ_KEY: + case OBJ_SEARCH_KEY: cmp = strcmp(left->uniqueid, right_key); break; - case OBJ_PARTIAL_KEY: + case OBJ_SEARCH_PARTIAL_KEY: /* * We could also use a partial key struct containing a length * so strlen() does not get called for every comparison instead. @@ -1361,11 +1357,7 @@ static void cdr_object_swap_snapshot(struct cdr_object_snapshot *old_snapshot, struct ast_channel_snapshot *new_snapshot) { cdr_object_update_cid(old_snapshot, new_snapshot); - if (old_snapshot->snapshot) { - ao2_t_ref(old_snapshot->snapshot, -1, "Drop ref for swap"); - } - ao2_t_ref(new_snapshot, +1, "Bump ref for swap"); - old_snapshot->snapshot = new_snapshot; + ao2_t_replace(old_snapshot->snapshot, new_snapshot, "Swap CDR shapshot"); } /* BASE METHOD IMPLEMENTATIONS */ @@ -1576,7 +1568,7 @@ static enum process_bridge_enter_results single_state_process_bridge_enter(struc !success && (channel_id = ao2_iterator_next(&it_cdrs)); ao2_ref(channel_id, -1)) { RAII_VAR(struct cdr_object *, cand_cdr_master, - ao2_find(active_cdrs_by_channel, channel_id, OBJ_KEY), + ao2_find(active_cdrs_by_channel, channel_id, OBJ_SEARCH_KEY), ao2_cleanup); struct cdr_object *cand_cdr; @@ -1627,11 +1619,9 @@ static int single_state_process_parking_bridge_enter(struct cdr_object *cdr, str static void dial_state_process_party_b(struct cdr_object *cdr, struct ast_channel_snapshot *snapshot) { ast_assert(snapshot != NULL); + ast_assert(cdr->party_b.snapshot + && !strcasecmp(cdr->party_b.snapshot->name, snapshot->name)); - if (!cdr->party_b.snapshot - || strcasecmp(cdr->party_b.snapshot->name, snapshot->name)) { - return; - } cdr_object_swap_snapshot(&cdr->party_b, snapshot); /* If party B hangs up, finalize this CDR */ @@ -1726,7 +1716,7 @@ static enum process_bridge_enter_results dial_state_process_bridge_enter(struct !success && (channel_id = ao2_iterator_next(&it_cdrs)); ao2_ref(channel_id, -1)) { RAII_VAR(struct cdr_object *, cand_cdr_master, - ao2_find(active_cdrs_by_channel, channel_id, OBJ_KEY), + ao2_find(active_cdrs_by_channel, channel_id, OBJ_SEARCH_KEY), ao2_cleanup); struct cdr_object *cand_cdr; @@ -1827,10 +1817,9 @@ static int dialed_pending_state_process_dial_begin(struct cdr_object *cdr, struc static void bridge_state_process_party_b(struct cdr_object *cdr, struct ast_channel_snapshot *snapshot) { - if (!cdr->party_b.snapshot - || strcasecmp(cdr->party_b.snapshot->name, snapshot->name)) { - return; - } + ast_assert(cdr->party_b.snapshot + && !strcasecmp(cdr->party_b.snapshot->name, snapshot->name)); + cdr_object_swap_snapshot(&cdr->party_b, snapshot); /* If party B hangs up, finalize this CDR */ @@ -1967,9 +1956,9 @@ static void handle_dial_message(void *data, struct stasis_subscription *sub, str /* Figure out who is running this show */ if (caller) { - cdr = ao2_find(active_cdrs_by_channel, caller->uniqueid, OBJ_KEY); + cdr = ao2_find(active_cdrs_by_channel, caller->uniqueid, OBJ_SEARCH_KEY); } else { - cdr = ao2_find(active_cdrs_by_channel, peer->uniqueid, OBJ_KEY); + cdr = ao2_find(active_cdrs_by_channel, peer->uniqueid, OBJ_SEARCH_KEY); } if (!cdr) { @@ -2125,7 +2114,7 @@ static void handle_channel_cache_message(void *data, struct stasis_subscription /* Handle Party A */ if (!cdr) { - cdr = ao2_find(active_cdrs_by_channel, uniqueid, OBJ_KEY); + cdr = ao2_find(active_cdrs_by_channel, uniqueid, OBJ_SEARCH_KEY); } if (!cdr) { ast_log(AST_LOG_WARNING, "No CDR for channel %s\n", name); @@ -2231,7 +2220,7 @@ static void handle_bridge_leave_message(void *data, struct stasis_subscription * RAII_VAR(struct module_config *, mod_cfg, ao2_global_obj_ref(module_configs), ao2_cleanup); RAII_VAR(struct cdr_object *, cdr, - ao2_find(active_cdrs_by_channel, channel->uniqueid, OBJ_KEY), + ao2_find(active_cdrs_by_channel, channel->uniqueid, OBJ_SEARCH_KEY), ao2_cleanup); struct cdr_object *it_cdr; struct bridge_leave_data leave_data = { @@ -2388,7 +2377,7 @@ static void handle_bridge_pairings(struct cdr_object *cdr, struct ast_bridge_sna it_channels = ao2_iterator_init(bridge->channels, 0); while ((channel_id = ao2_iterator_next(&it_channels))) { RAII_VAR(struct cdr_object *, cand_cdr, - ao2_find(active_cdrs_by_channel, channel_id, OBJ_KEY), + ao2_find(active_cdrs_by_channel, channel_id, OBJ_SEARCH_KEY), ao2_cleanup); if (!cand_cdr) { @@ -2534,7 +2523,7 @@ static void handle_bridge_enter_message(void *data, struct stasis_subscription * struct ast_bridge_snapshot *bridge = update->bridge; struct ast_channel_snapshot *channel = update->channel; RAII_VAR(struct cdr_object *, cdr, - ao2_find(active_cdrs_by_channel, channel->uniqueid, OBJ_KEY), + ao2_find(active_cdrs_by_channel, channel->uniqueid, OBJ_SEARCH_KEY), ao2_cleanup); RAII_VAR(struct module_config *, mod_cfg, ao2_global_obj_ref(module_configs), ao2_cleanup); @@ -2602,7 +2591,7 @@ static void handle_parked_call_message(void *data, struct stasis_subscription *s (unsigned int)stasis_message_timestamp(message)->tv_sec, (unsigned int)stasis_message_timestamp(message)->tv_usec); - cdr = ao2_find(active_cdrs_by_channel, channel->uniqueid, OBJ_KEY); + cdr = ao2_find(active_cdrs_by_channel, channel->uniqueid, OBJ_SEARCH_KEY); if (!cdr) { ast_log(AST_LOG_WARNING, "No CDR for channel %s\n", channel->name); ast_assert(0); @@ -4255,8 +4244,8 @@ int ast_cdr_engine_init(void) stasis_message_router_add(stasis_router, ast_parked_call_type(), handle_parked_call_message, NULL); stasis_message_router_add(stasis_router, cdr_sync_message_type(), handle_cdr_sync_message, NULL); - active_cdrs_by_channel = ao2_container_alloc(NUM_CDR_BUCKETS, - cdr_object_channel_hash_fn, cdr_object_channel_cmp_fn); + active_cdrs_by_channel = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, + NUM_CDR_BUCKETS, cdr_object_channel_hash_fn, NULL, cdr_object_channel_cmp_fn); if (!active_cdrs_by_channel) { return -1; } |