[asterisk-commits] dlee: branch dlee/ASTERISK-22243 r396344 - in /team/dlee/ASTERISK-22243: incl...

SVN commits to the Asterisk project asterisk-commits at lists.digium.com
Tue Aug 6 14:35:44 CDT 2013


Author: dlee
Date: Tue Aug  6 14:35:42 2013
New Revision: 396344

URL: http://svnview.digium.com/svn/asterisk?view=rev&rev=396344
Log:
Ref-bump topics when locking them.

Modified:
    team/dlee/ASTERISK-22243/include/asterisk/astobj2.h
    team/dlee/ASTERISK-22243/main/stasis.c

Modified: team/dlee/ASTERISK-22243/include/asterisk/astobj2.h
URL: http://svnview.digium.com/svn/asterisk/team/dlee/ASTERISK-22243/include/asterisk/astobj2.h?view=diff&rev=396344&r1=396343&r2=396344
==============================================================================
--- team/dlee/ASTERISK-22243/include/asterisk/astobj2.h (original)
+++ team/dlee/ASTERISK-22243/include/asterisk/astobj2.h Tue Aug  6 14:35:42 2013
@@ -509,6 +509,22 @@
 #define ao2_ref(o,delta)       __ao2_ref((o), (delta))
 
 #endif
+
+/*!
+ * \brief Bump refcount on an AO2 object by one, returning the object.
+ *
+ * This is useful for inlining a ref bump, and you don't care about the ref
+ * count.
+ *
+ * \param obj AO2 object
+ * \retval The given \a obj pointer.
+ */
+#define ao2_ref1(obj)				\
+	({					\
+		typeof(obj) __obj = (obj);	\
+		ao2_ref(__obj, +1);		\
+		__obj;				\
+	})
 
 int __ao2_ref_debug(void *o, int delta, const char *tag, const char *file, int line, const char *func);
 int __ao2_ref(void *o, int delta);

Modified: team/dlee/ASTERISK-22243/main/stasis.c
URL: http://svnview.digium.com/svn/asterisk/team/dlee/ASTERISK-22243/main/stasis.c?view=diff&rev=396344&r1=396343&r2=396344
==============================================================================
--- team/dlee/ASTERISK-22243/main/stasis.c (original)
+++ team/dlee/ASTERISK-22243/main/stasis.c Tue Aug  6 14:35:42 2013
@@ -232,7 +232,10 @@
 {
 	if (sub) {
 		size_t i;
-		struct stasis_topic *topic = sub->topic;
+		/* The subscription may be the last ref to this topic. Hold
+		 * the topic ref open until after the unlock. */
+		RAII_VAR(struct stasis_topic *, topic, ao2_ref1(sub->topic),
+			ao2_cleanup);
 		SCOPED_AO2LOCK(lock_topic, topic);
 
 		for (i = 0; i < topic->num_subscribers_current; ++i) {
@@ -424,9 +427,13 @@
 	return 0;
 }
 
-void stasis_forward_message(struct stasis_topic *topic, struct stasis_topic *publisher_topic, struct stasis_message *message)
+void stasis_forward_message(struct stasis_topic *t, struct stasis_topic *publisher_topic, struct stasis_message *message)
 {
 	size_t i;
+	/* The dispatch may dispose of the final reference to the topic. Hold
+	 * it open until after the unlock.
+	 */
+	RAII_VAR(struct stasis_topic *, topic, ao2_ref1(t), ao2_cleanup);
 	SCOPED_AO2LOCK(lock, topic);
 
 	ast_assert(topic != NULL);




More information about the asterisk-commits mailing list