Remove constant conditionals (dead-code).
[asterisk/asterisk.git] / main / stasis_cache.c
index 12f4996..ce4e023 100644 (file)
@@ -29,8 +29,6 @@
 
 #include "asterisk.h"
 
-ASTERISK_FILE_VERSION(__FILE__, "$Revision$")
-
 #include "asterisk/astobj2.h"
 #include "asterisk/hashtab.h"
 #include "asterisk/stasis_internal.h"
@@ -127,9 +125,17 @@ struct stasis_caching_topic *stasis_caching_unsubscribe_and_join(struct stasis_c
        return NULL;
 }
 
+/*!
+ * \brief The key for an entry in the cache
+ * \note The items in this struct must be immutable for the item in the cache
+ */
 struct cache_entry_key {
+       /*! The message type of the item stored in the cache */
        struct stasis_message_type *type;
+       /*! The unique ID of the item stored in the cache */
        const char *id;
+       /*! The hash, computed from \c type and \c id */
+       unsigned int hash;
 };
 
 struct stasis_cache_entry {
@@ -166,15 +172,24 @@ static void cache_entry_dtor(void *obj)
        AST_VECTOR_FREE(&entry->remote);
 }
 
+static void cache_entry_compute_hash(struct cache_entry_key *key)
+{
+       key->hash = ast_hashtab_hash_string(stasis_message_type_name(key->type));
+       key->hash += ast_hashtab_hash_string(key->id);
+}
+
 static struct stasis_cache_entry *cache_entry_create(struct stasis_message_type *type, const char *id, struct stasis_message *snapshot)
 {
        struct stasis_cache_entry *entry;
        int is_remote;
 
-       ast_assert(type != NULL);
        ast_assert(id != NULL);
        ast_assert(snapshot != NULL);
 
+       if (!type) {
+               return NULL;
+       }
+
        entry = ao2_alloc_options(sizeof(*entry), cache_entry_dtor,
                AO2_ALLOC_OPT_LOCK_NOLOCK);
        if (!entry) {
@@ -187,6 +202,7 @@ static struct stasis_cache_entry *cache_entry_create(struct stasis_message_type
                return NULL;
        }
        entry->key.type = ao2_bump(type);
+       cache_entry_compute_hash(&entry->key);
 
        is_remote = ast_eid_cmp(&ast_eid_default, stasis_message_eid(snapshot)) ? 1 : 0;
        if (AST_VECTOR_INIT(&entry->remote, is_remote)) {
@@ -211,7 +227,6 @@ static int cache_entry_hash(const void *obj, int flags)
 {
        const struct stasis_cache_entry *object;
        const struct cache_entry_key *key;
-       int hash = 0;
 
        switch (flags & OBJ_SEARCH_MASK) {
        case OBJ_SEARCH_KEY:
@@ -227,9 +242,7 @@ static int cache_entry_hash(const void *obj, int flags)
                return 0;
        }
 
-       hash += ast_hashtab_hash_string(stasis_message_type_name(key->type));
-       hash += ast_hashtab_hash_string(key->id);
-       return hash;
+       return (int)key->hash;
 }
 
 static int cache_entry_cmp(void *obj, void *arg, int flags)
@@ -343,10 +356,18 @@ struct stasis_message *stasis_cache_entry_get_remote(struct stasis_cache_entry *
 static struct stasis_cache_entry *cache_find(struct ao2_container *entries, struct stasis_message_type *type, const char *id)
 {
        struct cache_entry_key search_key;
+       struct stasis_cache_entry *entry;
 
        search_key.type = type;
        search_key.id = id;
-       return ao2_find(entries, &search_key, OBJ_SEARCH_KEY | OBJ_NOLOCK);
+       cache_entry_compute_hash(&search_key);
+       entry = ao2_find(entries, &search_key, OBJ_SEARCH_KEY | OBJ_NOLOCK);
+
+       /* Ensure that what we looked for is what we found. */
+       ast_assert(!entry
+               || (!strcmp(stasis_message_type_name(entry->key.type),
+                       stasis_message_type_name(type)) && !strcmp(entry->key.id, id)));
+       return entry;
 }
 
 /*!
@@ -530,9 +551,12 @@ struct ao2_container *stasis_cache_get_all(struct stasis_cache *cache, struct st
 
        ast_assert(cache != NULL);
        ast_assert(cache->entries != NULL);
-       ast_assert(type != NULL);
        ast_assert(id != NULL);
 
+       if (!type) {
+               return NULL;
+       }
+
        found = ao2_container_alloc_list(AO2_ALLOC_OPT_LOCK_NOLOCK, 0, NULL, NULL);
        if (!found) {
                return NULL;
@@ -599,9 +623,12 @@ struct stasis_message *stasis_cache_get_by_eid(struct stasis_cache *cache, struc
 
        ast_assert(cache != NULL);
        ast_assert(cache->entries != NULL);
-       ast_assert(type != NULL);
        ast_assert(id != NULL);
 
+       if (!type) {
+               return NULL;
+       }
+
        ao2_rdlock(cache->entries);
 
        cached_entry = cache_find(cache->entries, type, id);
@@ -732,6 +759,10 @@ static struct stasis_message *update_create(struct stasis_message *old_snapshot,
 
        ast_assert(old_snapshot != NULL || new_snapshot != NULL);
 
+       if (!stasis_cache_update_type()) {
+               return NULL;
+       }
+
        update = ao2_alloc_options(sizeof(*update), stasis_cache_update_dtor,
                AO2_ALLOC_OPT_LOCK_NOLOCK);
        if (!update) {
@@ -809,7 +840,7 @@ static void caching_topic_exec(void *data, struct stasis_subscription *sub,
                        }
                        ao2_cleanup(update);
                } else {
-                       ast_log(LOG_ERROR,
+                       ast_debug(1,
                                "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(msg_type), msg_id);
@@ -861,7 +892,7 @@ struct stasis_caching_topic *stasis_caching_topic_create(struct stasis_topic *or
        ao2_ref(cache, +1);
        caching_topic->cache = cache;
 
-       sub = internal_stasis_subscribe(original_topic, caching_topic_exec, caching_topic, 0);
+       sub = internal_stasis_subscribe(original_topic, caching_topic_exec, caching_topic, 0, 0);
        if (sub == NULL) {
                return NULL;
        }