[asterisk-commits] dlee: branch dlee/stasis-cache-split r393982 - /team/dlee/stasis-cache-split/...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Jul 10 10:59:22 CDT 2013


Author: dlee
Date: Wed Jul 10 10:59:21 2013
New Revision: 393982

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=393982
Log:
Revert stasis_cache back to sanity

Modified:
    team/dlee/stasis-cache-split/main/stasis_cache.c

Modified: team/dlee/stasis-cache-split/main/stasis_cache.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/stasis-cache-split/main/stasis_cache.c?view=diff&rev=393982&r1=393981&r2=393982
==============================================================================
--- team/dlee/stasis-cache-split/main/stasis_cache.c (original)
+++ team/dlee/stasis-cache-split/main/stasis_cache.c Wed Jul 10 10:59:21 2013
@@ -56,6 +56,7 @@
 	struct stasis_topic *topic;
 	struct stasis_topic *original_topic;
 	struct stasis_subscription *sub;
+	snapshot_get_id id_fn;
 };
 
 static void stasis_caching_topic_dtor(void *obj) {
@@ -151,7 +152,7 @@
 	return entry;
 }
 
-static int cache_entry_hash(const void *obj, int flags)
+__attribute__((unused)) static int cache_entry_hash(const void *obj, int flags)
 {
 	const struct cache_entry *entry = obj;
 	int hash = 0;
@@ -163,7 +164,7 @@
 	return hash;
 }
 
-static int cache_entry_cmp(void *obj, void *arg, int flags)
+__attribute__((unused)) static int cache_entry_cmp(void *obj, void *arg, int flags)
 {
 	const struct cache_entry *left = obj;
 	const struct cache_entry *right = arg;
@@ -177,136 +178,23 @@
 	return 0;
 }
 
-static void cache_dtor(void *obj)
-{
-	struct stasis_cache *cache = obj;
-
-	ao2_cleanup(cache->entries);
-	cache->entries = NULL;
-	ao2_cleanup(cache->secondary_cache);
-	cache->secondary_cache = NULL;
-}
-
-struct stasis_cache *stasis_cache_create(snapshot_get_id id_fn)
-{
-	RAII_VAR(struct stasis_cache *, cache, NULL, ao2_cleanup);
-
-	cache = ao2_alloc(sizeof(*cache), cache_dtor);
-	if (!cache) {
-		return NULL;
-	}
-
-	cache->entries = ao2_container_alloc(NUM_CACHE_BUCKETS, cache_entry_hash,
-		cache_entry_cmp);
-	if (!cache->entries) {
-		return NULL;
-	}
-
-	cache->id_fn = id_fn;
-
-	ao2_ref(cache, +1);
-	return cache;
-}
-
-struct stasis_cache *stasis_cache_create_secondary(
-	struct stasis_cache *primary_cache, snapshot_get_id id_fn)
-{
-	RAII_VAR(struct stasis_cache *, cache, NULL, ao2_cleanup);
-
-	if (!primary_cache) {
-		return NULL;
-	}
-
-	cache = stasis_cache_create(id_fn);
-	if (!cache) {
-		return NULL;
-	}
-
-	{
-		SCOPED_AO2LOCK(lock, parent);
-		cache->secondary_cache = parent->secondary_cache;
-		ao2_ref(cache, +1);
-		parent->secondary_cache = cache;
-	}
-
-	ao2_ref(cache, +1);
-	return cache;
-}
-
-struct stasis_message *stasis_cache_get(struct stasis_cache *cache,
-	struct stasis_message_type *type, const char *id)
-{
-	RAII_VAR(struct cache_entry *, search_entry, NULL, ao2_cleanup);
+static struct stasis_message *cache_put(struct stasis_cache *cache, struct stasis_message_type *type, const char *id, struct stasis_message *new_snapshot)
+{
+	RAII_VAR(struct cache_entry *, new_entry, NULL, ao2_cleanup);
 	RAII_VAR(struct cache_entry *, cached_entry, NULL, ao2_cleanup);
-
-	search_entry = cache_entry_create(type, id, NULL);
-	if (search_entry == NULL) {
-		return NULL;
-	}
-
-	cached_entry = ao2_find(cache->entries, search_entry, OBJ_POINTER);
-	if (cached_entry == NULL) {
-		return NULL;
-	}
-
-	ast_assert(cached_entry->snapshot != NULL);
-	ao2_ref(cached_entry->snapshot, +1);
-	return cached_entry->snapshot;
-}
-
-static struct stasis_message *cache_put(struct stasis_cache *cache,
-	struct stasis_message *message);
-
-static void cache_put_secondary(struct stasis_cache *cache,
-	struct stasis_message *message)
-{
-	RAII_VAR(struct stasis_cache *, secondary_cache, NULL, ao2_cleanup);
-
-	{
-		SCOPED_AO2LOCK(lock, cache);
-		secondary_cache = cache->secondary_cache;
-		if (!secondary_cache) {
-			return;
-		}
-		ao2_ref(secondary_cache, +1);
-	}
-
-	cache_put(secondary_cache, message);
-}
-
-static struct stasis_message *cache_put(struct stasis_cache *cache,
-	struct stasis_message *message)
-{
-	RAII_VAR(struct cache_entry *, cached_entry, NULL, ao2_cleanup);
-	const char *id;
-
-	/* update secondary cache */
-	cache_put_secondary(cache, message);
-
-	/* Handle cache clear event */
-	if (stasis_cache_clear_type() == stasis_message_type(message)) {
-		RAII_VAR(struct cache_entry *, clear_entry, NULL, ao2_cleanup);
-		struct stasis_message *clear_snapshot =
-			stasis_message_data(message);
-		id = cache->id_fn(clear_snapshot);
-
-		clear_entry = cache_entry_create(type, id, clear_snapshot);
-
-		cached_entry = ao2_find(cache->entries, clear_entry, OBJ_POINTER | OBJ_UNLINK);
+	struct stasis_message *old_snapshot = NULL;
+
+	ast_assert(cache->entries != NULL);
+
+	new_entry = cache_entry_create(type, id, new_snapshot);
+
+	if (new_snapshot == NULL) {
+		/* Remove entry from cache */
+		cached_entry = ao2_find(cache->entries, new_entry, OBJ_POINTER | OBJ_UNLINK);
 		if (cached_entry) {
 			old_snapshot = cached_entry->snapshot;
 			cached_entry->snapshot = NULL;
 		}
-	}
-
-	if (!id) {
-		return NULL;
-	}
-
-	ast_assert(cache->entries != NULL);
-
-
-	if (is_clear) {
 	} else {
 		/* Insert/update cache */
 		SCOPED_AO2LOCK(lock, cache->entries);
@@ -321,10 +209,32 @@
 			/* Insert into the cache */
 			ao2_link_flags(cache->entries, new_entry, OBJ_NOLOCK);
 		}
-	}
-
+
+	}
 
 	return old_snapshot;
+}
+
+struct stasis_message *stasis_cache_get(struct stasis_cache *cache, struct stasis_message_type *type, const char *id)
+{
+	RAII_VAR(struct cache_entry *, search_entry, NULL, ao2_cleanup);
+	RAII_VAR(struct cache_entry *, cached_entry, NULL, ao2_cleanup);
+
+	ast_assert(cache->entries != NULL);
+
+	search_entry = cache_entry_create(type, id, NULL);
+	if (search_entry == NULL) {
+		return NULL;
+	}
+
+	cached_entry = ao2_find(cache->entries, search_entry, OBJ_POINTER);
+	if (cached_entry == NULL) {
+		return NULL;
+	}
+
+	ast_assert(cached_entry->snapshot != NULL);
+	ao2_ref(cached_entry->snapshot, +1);
+	return cached_entry->snapshot;
 }
 
 struct cache_dump_data {
@@ -431,45 +341,42 @@
 static void caching_topic_exec(void *data, struct stasis_subscription *sub, struct stasis_topic *topic, struct stasis_message *message)
 {
 	RAII_VAR(struct stasis_caching_topic *, caching_topic_needs_unref, NULL, ao2_cleanup);
-	RAII_VAR(struct stasis_message *, new_message, NULL, ao2_cleanup);
 	struct stasis_caching_topic *caching_topic = data;
 	const char *id = NULL;
 
 	ast_assert(caching_topic->topic != NULL);
-	ast_assert(caching_topic->cache != NULL);
+	ast_assert(caching_topic->id_fn != NULL);
 
 	if (stasis_subscription_final_message(sub, message)) {
 		caching_topic_needs_unref = caching_topic;
 	}
 
-	new_message = cache_put(caching_topic->cache, message);
-	if (new_message) {
-		stasis_forward_message(caching_topic->topic, topic, message);
-
-	}
-
+	/* Handle cache clear event */
 	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_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);
 
-		old_snapshot = cache_put(caching_topic->cache, clear_type, clear_msg, 1);
-		if (old_snapshot) {
-			update = update_create(topic, old_snapshot, NULL);
-			stasis_publish(caching_topic->topic, update);
+		if (clear_id) {
+			old_snapshot = cache_put(caching_topic->cache, 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;
 		}
-
-		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;
-	}
-
-	id = caching_topic->cache->id_fn(message);
+	}
+
+	id = caching_topic->id_fn(message);
 	if (id == NULL) {
 		/* Object isn't cached; forward */
 		stasis_forward_message(caching_topic->topic, topic, message);
@@ -478,7 +385,7 @@
 		RAII_VAR(struct stasis_message *, old_snapshot, NULL, ao2_cleanup);
 		RAII_VAR(struct stasis_message *, update, NULL, ao2_cleanup);
 
-		old_snapshot = cache_put(caching_topic->cache, stasis_message_type(message), message, );
+		old_snapshot = cache_put(caching_topic->cache, stasis_message_type(message), id, message);
 
 		update = update_create(topic, old_snapshot, message);
 		if (update == NULL) {
@@ -493,8 +400,7 @@
 	}
 }
 
-struct stasis_caching_topic *stasis_caching_topic_create(
-	struct stasis_topic *original_topic, struct stasis_cache *cache)
+struct stasis_caching_topic *stasis_caching_topic_create(struct stasis_topic *original_topic, struct stasis_cache *cache)
 {
 	RAII_VAR(struct stasis_caching_topic *, caching_topic, NULL, ao2_cleanup);
 	struct stasis_subscription *sub;
@@ -511,13 +417,13 @@
 		return NULL;
 	}
 
+	caching_topic->topic = stasis_topic_create(new_name);
+	if (caching_topic->topic == NULL) {
+		return NULL;
+	}
+
 	ao2_ref(cache, +1);
 	caching_topic->cache = cache;
-
-	caching_topic->topic = stasis_topic_create(new_name);
-	if (caching_topic->topic == NULL) {
-		return NULL;
-	}
 
 	sub = internal_stasis_subscribe(original_topic, caching_topic_exec, caching_topic, 0);
 	if (sub == NULL) {




More information about the asterisk-commits mailing list