[asterisk-commits] dlee: branch dlee/performance r399392 - /team/dlee/performance/main/stasis.c

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Wed Sep 18 12:46:54 CDT 2013


Author: dlee
Date: Wed Sep 18 12:46:52 2013
New Revision: 399392

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=399392
Log:
Change dispatch to a regular allocation. It has a confined lifecycle, so AO2
bought us nothing.

Modified:
    team/dlee/performance/main/stasis.c

Modified: team/dlee/performance/main/stasis.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/performance/main/stasis.c?view=diff&rev=399392&r1=399391&r2=399392
==============================================================================
--- team/dlee/performance/main/stasis.c (original)
+++ team/dlee/performance/main/stasis.c Wed Sep 18 12:46:52 2013
@@ -34,7 +34,6 @@
 #include "asterisk/astobj2.h"
 #include "asterisk/stasis_internal.h"
 #include "asterisk/stasis.h"
-#include "asterisk/threadpool.h"
 #include "asterisk/taskprocessor.h"
 #include "asterisk/utils.h"
 #include "asterisk/uuid.h"
@@ -465,23 +464,24 @@
 	struct stasis_subscription *sub;
 };
 
-static void dispatch_dtor(void *data)
-{
-	struct dispatch *dispatch = data;
+static void dispatch_dtor(struct dispatch *dispatch)
+{
 	ao2_cleanup(dispatch->topic);
 	ao2_cleanup(dispatch->message);
 	ao2_cleanup(dispatch->sub);
+
+	ast_free(dispatch);
 }
 
 static struct dispatch *dispatch_create(struct stasis_topic *topic, struct stasis_message *message, struct stasis_subscription *sub)
 {
-	RAII_VAR(struct dispatch *, dispatch, NULL, ao2_cleanup);
+	struct dispatch *dispatch;
 
 	ast_assert(topic != NULL);
 	ast_assert(message != NULL);
 	ast_assert(sub != NULL);
 
-	dispatch = ao2_alloc(sizeof(*dispatch), dispatch_dtor);
+	dispatch = ast_malloc(sizeof(*dispatch));
 	if (!dispatch) {
 		return NULL;
 	}
@@ -495,7 +495,6 @@
 	dispatch->sub = sub;
 	ao2_ref(sub, +1);
 
-	ao2_ref(dispatch, +1);
 	return dispatch;
 }
 
@@ -506,9 +505,10 @@
  */
 static int dispatch_exec(void *data)
 {
-	RAII_VAR(struct dispatch *, dispatch, data, ao2_cleanup);
+	struct dispatch *dispatch = data;
 
 	subscription_invoke(dispatch->sub, dispatch->topic, dispatch->message);
+	dispatch_dtor(data);
 
 	return 0;
 }
@@ -532,7 +532,7 @@
 		ast_assert(sub != NULL);
 
 		if (sub->mailbox) {
-			RAII_VAR(struct dispatch *, dispatch, NULL, ao2_cleanup);
+			struct dispatch *dispatch;
 
 			dispatch = dispatch_create(publisher_topic, message, sub);
 			if (!dispatch) {
@@ -540,12 +540,11 @@
 				break;
 			}
 
-			if (ast_taskprocessor_push(sub->mailbox, dispatch_exec, dispatch) == 0) {
-				/* Ownership transferred to mailbox.
-				 * Don't increment ref, b/c the task processor
-				 * may have already gotten rid of the object.
+			if (ast_taskprocessor_push(sub->mailbox, dispatch_exec, dispatch) != 0) {
+				/* Push failed; just delete the dispatch.
 				 */
-				dispatch = NULL;
+				ast_log(LOG_DEBUG, "Dropping dispatch\n");
+				dispatch_dtor(dispatch);
 			}
 		} else {
 			/* Dispatch directly */




More information about the asterisk-commits mailing list