diff options
author | Kinsey Moore <kmoore@digium.com> | 2013-06-07 12:56:56 +0000 |
---|---|---|
committer | Kinsey Moore <kmoore@digium.com> | 2013-06-07 12:56:56 +0000 |
commit | 759a7e4a30b5e69738670494e5c19b6982a34644 (patch) | |
tree | 56e190b02bf90267738a4da3f0c8bb87e55424eb /main/stasis_cache.c | |
parent | 611416623748504be81c58b455205a4bc7fff414 (diff) |
Rework stasis cache clear events
Stasis cache clear message payloads now consist of a stasis_message
representative of the message to be cleared from the cache. This allows
multiple parallel caches to coexist and be cleared properly by the same
cache clear message even when keyed on different fields.
This change fixes a bug where multiple cache clears could be posted for
channels. The cache clear is now produced in the destructor instead of
ast_hangup.
Additionally, dummy channels are no longer capable of producing channel
snapshots.
Review: https://reviewboard.asterisk.org/r/2596
git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@390830 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'main/stasis_cache.c')
-rw-r--r-- | main/stasis_cache.c | 55 |
1 files changed, 20 insertions, 35 deletions
diff --git a/main/stasis_cache.c b/main/stasis_cache.c index ac34959db..546ad4998 100644 --- a/main/stasis_cache.c +++ b/main/stasis_cache.c @@ -262,30 +262,11 @@ struct ao2_container *stasis_cache_dump(struct stasis_caching_topic *caching_top STASIS_MESSAGE_TYPE_DEFN(stasis_cache_clear_type); STASIS_MESSAGE_TYPE_DEFN(stasis_cache_update_type); -static void cache_clear_dtor(void *obj) +struct stasis_message *stasis_cache_clear_create(struct stasis_message *id_message) { - struct stasis_cache_clear *ev = obj; - ao2_cleanup(ev->type); - ev->type = NULL; -} - -struct stasis_message *stasis_cache_clear_create(struct stasis_message_type *type, const char *id) -{ - RAII_VAR(struct stasis_cache_clear *, ev, NULL, ao2_cleanup); RAII_VAR(struct stasis_message *, msg, NULL, ao2_cleanup); - ev = ao2_alloc(sizeof(*ev) + strlen(id) + 1, cache_clear_dtor); - if (!ev) { - return NULL; - } - - /* strcpy safe */ - strcpy(ev->id, id); - ao2_ref(type, +1); - ev->type = type; - - msg = stasis_message_create(stasis_cache_clear_type(), ev); - + msg = stasis_message_create(stasis_cache_clear_type(), id_message); if (!msg) { return NULL; } @@ -363,21 +344,25 @@ static void caching_topic_exec(void *data, struct stasis_subscription *sub, stru if (stasis_cache_clear_type() == stasis_message_type(message)) { RAII_VAR(struct stasis_message *, old_snapshot, NULL, ao2_cleanup); RAII_VAR(struct stasis_message *, update, NULL, ao2_cleanup); - struct stasis_cache_clear *clear = stasis_message_data(message); - ast_assert(clear->type != NULL); - ast_assert(clear->id != NULL); - old_snapshot = cache_put(caching_topic, clear->type, clear->id, NULL); - if (old_snapshot) { - update = update_create(topic, old_snapshot, NULL); - stasis_publish(caching_topic->topic, update); - } else { - /* While this could be a problem, it's very likely to - * happen with message forwarding */ - ast_debug(1, - "Attempting to remove an item from the cache that isn't there: %s %s\n", - stasis_message_type_name(clear->type), clear->id); + struct stasis_message *clear_msg = stasis_message_data(message); + const char *clear_id = caching_topic->id_fn(clear_msg); + struct stasis_message_type *clear_type = stasis_message_type(clear_msg); + + ast_assert(clear_type != NULL); + + if (clear_id) { + old_snapshot = cache_put(caching_topic, clear_type, clear_id, NULL); + if (old_snapshot) { + update = update_create(topic, old_snapshot, NULL); + stasis_publish(caching_topic->topic, update); + return; + } + + ast_log(LOG_ERROR, + "Attempting to remove an item from the %s cache that isn't there: %s %s\n", + stasis_topic_name(caching_topic->topic), stasis_message_type_name(clear_type), clear_id); + return; } - return; } id = caching_topic->id_fn(message); |