<p>sungtae kim has uploaded this change for <strong>review</strong>.</p><p><a href="https://gerrit.asterisk.org/10929">View Change</a></p><pre style="font-family: monospace,monospace; white-space: pre-wrap;">stasis.c: Added topic_all container<br><br>Added topic_all container for centralizing the topic. This makes more<br>easier to managing the topics.<br><br>Change-Id: Ie86d125d2966f93de74ee00f47ae6fbc8c081c5f<br>---<br>M include/asterisk/stasis.h<br>M main/app.c<br>M main/cdr.c<br>M main/cel.c<br>M main/channel_internal_api.c<br>M main/devicestate.c<br>M main/manager.c<br>M main/parking.c<br>M main/presencestate.c<br>M main/rtp_engine.c<br>M main/security_events.c<br>M main/stasis.c<br>M main/stasis_bridges.c<br>M main/stasis_cache.c<br>M main/stasis_cache_pattern.c<br>M main/stasis_channels.c<br>M main/stasis_system.c<br>M main/test.c<br>M res/res_corosync.c<br>M res/stasis/app.c<br>M tests/test_stasis.c<br>21 files changed, 168 insertions(+), 50 deletions(-)<br><br></pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;">git pull ssh://gerrit.asterisk.org:29418/asterisk refs/changes/29/10929/1</pre><pre style="font-family: monospace,monospace; white-space: pre-wrap;"><span>diff --git a/include/asterisk/stasis.h b/include/asterisk/stasis.h</span><br><span>index 09db9ea..41997b9 100644</span><br><span>--- a/include/asterisk/stasis.h</span><br><span>+++ b/include/asterisk/stasis.h</span><br><span>@@ -518,6 +518,18 @@</span><br><span> struct stasis_topic *stasis_topic_create(const char *name);</span><br><span> </span><br><span> /*!</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Release a topic</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param topic Topic to release.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+void stasis_topic_release(struct stasis_topic *topic);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*!</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief Get a topic of given name.</span><br><span style="color: hsl(120, 100%, 40%);">+ * \param name Name of topic.</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+struct stasis_topic *stasis_topic_get_by_name(const char *name);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+/*!</span><br><span>  * \brief Return the name of a topic.</span><br><span>  * \param topic Topic.</span><br><span>  * \return Name of the topic.</span><br><span>diff --git a/main/app.c b/main/app.c</span><br><span>index ec74490..c7b0839 100644</span><br><span>--- a/main/app.c</span><br><span>+++ b/main/app.c</span><br><span>@@ -3407,11 +3407,11 @@</span><br><span> {</span><br><span>  ao2_cleanup(queue_topic_pool);</span><br><span>       queue_topic_pool = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-        ao2_cleanup(queue_topic_all);</span><br><span style="color: hsl(120, 100%, 40%);">+ stasis_topic_release(queue_topic_all);</span><br><span>       queue_topic_all = NULL;</span><br><span>      ao2_cleanup(mwi_topic_pool);</span><br><span>         mwi_topic_pool = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-  ao2_cleanup(mwi_topic_all);</span><br><span style="color: hsl(120, 100%, 40%);">+   stasis_topic_release(mwi_topic_all);</span><br><span>         mwi_topic_all = NULL;</span><br><span>        ao2_cleanup(mwi_state_cache);</span><br><span>        mwi_state_cache = NULL;</span><br><span>diff --git a/main/cdr.c b/main/cdr.c</span><br><span>index 462c3e6..ad15c3d 100644</span><br><span>--- a/main/cdr.c</span><br><span>+++ b/main/cdr.c</span><br><span>@@ -4350,7 +4350,7 @@</span><br><span>         stasis_message_router_unsubscribe_and_join(stasis_router);</span><br><span>   stasis_router = NULL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       ao2_cleanup(cdr_topic);</span><br><span style="color: hsl(120, 100%, 40%);">+       stasis_topic_release(cdr_topic);</span><br><span>     cdr_topic = NULL;</span><br><span> </span><br><span>        STASIS_MESSAGE_TYPE_CLEANUP(cdr_sync_message_type);</span><br><span>diff --git a/main/cel.c b/main/cel.c</span><br><span>index 95376db..817fc1d 100644</span><br><span>--- a/main/cel.c</span><br><span>+++ b/main/cel.c</span><br><span>@@ -1399,9 +1399,9 @@</span><br><span> </span><br><span> static void destroy_subscriptions(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    ao2_cleanup(cel_aggregation_topic);</span><br><span style="color: hsl(120, 100%, 40%);">+   stasis_topic_release(cel_aggregation_topic);</span><br><span>         cel_aggregation_topic = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-   ao2_cleanup(cel_topic);</span><br><span style="color: hsl(120, 100%, 40%);">+       stasis_topic_release(cel_topic);</span><br><span>     cel_topic = NULL;</span><br><span> </span><br><span>        cel_channel_forwarder = stasis_forward_cancel(cel_channel_forwarder);</span><br><span>diff --git a/main/channel_internal_api.c b/main/channel_internal_api.c</span><br><span>index 22a2bb6..0824dae 100644</span><br><span>--- a/main/channel_internal_api.c</span><br><span>+++ b/main/channel_internal_api.c</span><br><span>@@ -1475,7 +1475,7 @@</span><br><span>       chan->channel_forward = stasis_forward_cancel(chan->channel_forward);</span><br><span>  chan->endpoint_forward = stasis_forward_cancel(chan->endpoint_forward);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       ao2_cleanup(chan->topic);</span><br><span style="color: hsl(120, 100%, 40%);">+  stasis_topic_release(chan->topic);</span><br><span>        chan->topic = NULL;</span><br><span> </span><br><span>   ast_channel_internal_set_stream_topology(chan, NULL);</span><br><span>@@ -1535,7 +1535,7 @@</span><br><span>        chan->channel_forward = stasis_forward_all(ast_channel_topic(chan),</span><br><span>               ast_channel_topic_all());</span><br><span>    if (!chan->channel_forward) {</span><br><span style="color: hsl(0, 100%, 40%);">-                ao2_ref(chan->topic, -1);</span><br><span style="color: hsl(120, 100%, 40%);">+          stasis_topic_release(chan->topic);</span><br><span>                chan->topic = NULL;</span><br><span>               return -1;</span><br><span>   }</span><br><span>diff --git a/main/devicestate.c b/main/devicestate.c</span><br><span>index b6c740c..d8281f1 100644</span><br><span>--- a/main/devicestate.c</span><br><span>+++ b/main/devicestate.c</span><br><span>@@ -889,7 +889,7 @@</span><br><span>         ao2_cleanup(device_state_topic_pool);</span><br><span>        device_state_topic_pool = NULL;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-     ao2_cleanup(device_state_topic_all);</span><br><span style="color: hsl(120, 100%, 40%);">+  stasis_topic_release(device_state_topic_all);</span><br><span>        device_state_topic_all = NULL;</span><br><span> </span><br><span>   STASIS_MESSAGE_TYPE_CLEANUP(ast_device_state_message_type);</span><br><span>diff --git a/main/manager.c b/main/manager.c</span><br><span>index 0c715e4..13618db 100644</span><br><span>--- a/main/manager.c</span><br><span>+++ b/main/manager.c</span><br><span>@@ -8846,7 +8846,7 @@</span><br><span>     rtp_topic_forwarder = NULL;</span><br><span>  stasis_forward_cancel(security_topic_forwarder);</span><br><span>     security_topic_forwarder = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-        ao2_cleanup(manager_topic);</span><br><span style="color: hsl(120, 100%, 40%);">+   stasis_topic_release(manager_topic);</span><br><span>         manager_topic = NULL;</span><br><span>        STASIS_MESSAGE_TYPE_CLEANUP(ast_manager_get_generic_type);</span><br><span> </span><br><span>diff --git a/main/parking.c b/main/parking.c</span><br><span>index bf0d0b6..4005758 100644</span><br><span>--- a/main/parking.c</span><br><span>+++ b/main/parking.c</span><br><span>@@ -46,7 +46,7 @@</span><br><span> static void parking_stasis_cleanup(void)</span><br><span> {</span><br><span>     STASIS_MESSAGE_TYPE_CLEANUP(ast_parked_call_type);</span><br><span style="color: hsl(0, 100%, 40%);">-      ao2_cleanup(parking_topic);</span><br><span style="color: hsl(120, 100%, 40%);">+   stasis_topic_release(parking_topic);</span><br><span>         parking_topic = NULL;</span><br><span> }</span><br><span> </span><br><span>diff --git a/main/presencestate.c b/main/presencestate.c</span><br><span>index 65b7f69..cce6efd 100644</span><br><span>--- a/main/presencestate.c</span><br><span>+++ b/main/presencestate.c</span><br><span>@@ -483,7 +483,7 @@</span><br><span> </span><br><span> static void presence_state_engine_cleanup(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   ao2_cleanup(presence_state_topic_all);</span><br><span style="color: hsl(120, 100%, 40%);">+        stasis_topic_release(presence_state_topic_all);</span><br><span>      presence_state_topic_all = NULL;</span><br><span>     ao2_cleanup(presence_state_cache);</span><br><span>   presence_state_cache = NULL;</span><br><span>diff --git a/main/rtp_engine.c b/main/rtp_engine.c</span><br><span>index fd1613c..7241521 100644</span><br><span>--- a/main/rtp_engine.c</span><br><span>+++ b/main/rtp_engine.c</span><br><span>@@ -3512,7 +3512,7 @@</span><br><span> {</span><br><span>   int x;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-      ao2_cleanup(rtp_topic);</span><br><span style="color: hsl(120, 100%, 40%);">+       stasis_topic_release(rtp_topic);</span><br><span>     rtp_topic = NULL;</span><br><span>    STASIS_MESSAGE_TYPE_CLEANUP(ast_rtp_rtcp_received_type);</span><br><span>     STASIS_MESSAGE_TYPE_CLEANUP(ast_rtp_rtcp_sent_type);</span><br><span>diff --git a/main/security_events.c b/main/security_events.c</span><br><span>index 37dce02..9e34604 100644</span><br><span>--- a/main/security_events.c</span><br><span>+++ b/main/security_events.c</span><br><span>@@ -474,7 +474,7 @@</span><br><span> </span><br><span> static void security_stasis_cleanup(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   ao2_cleanup(security_topic);</span><br><span style="color: hsl(120, 100%, 40%);">+  stasis_topic_release(security_topic);</span><br><span>        security_topic = NULL;</span><br><span> </span><br><span>   STASIS_MESSAGE_TYPE_CLEANUP(ast_security_event_type);</span><br><span>diff --git a/main/stasis.c b/main/stasis.c</span><br><span>index f05f5ff..4c53d46 100644</span><br><span>--- a/main/stasis.c</span><br><span>+++ b/main/stasis.c</span><br><span>@@ -307,6 +307,9 @@</span><br><span> </span><br><span> STASIS_MESSAGE_TYPE_DEFN(stasis_subscription_change_type);</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+#define TOPIC_ALL_BUCKETS 997</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #ifdef AST_DEVMODE</span><br><span> </span><br><span> /*! The number of buckets to use for topic statistics */</span><br><span>@@ -367,9 +370,21 @@</span><br><span> #endif</span><br><span> </span><br><span>     /*! Name of the topic */</span><br><span style="color: hsl(0, 100%, 40%);">-        char name[0];</span><br><span style="color: hsl(120, 100%, 40%);">+//       char name[0];</span><br><span style="color: hsl(120, 100%, 40%);">+ char *name;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ /*! Uniqueid of the topic */</span><br><span style="color: hsl(120, 100%, 40%);">+//        char uniqueid[0];</span><br><span style="color: hsl(120, 100%, 40%);">+     char *uniqueid;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+     char buf[0];</span><br><span> };</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct ao2_container *topic_all;</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+AO2_STRING_FIELD_HASH_FN(stasis_topic, name);</span><br><span style="color: hsl(120, 100%, 40%);">+AO2_STRING_FIELD_CMP_FN(stasis_topic, name);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> /* Forward declarations for the tightly-coupled subscription object */</span><br><span> static int topic_add_subscription(struct stasis_topic *topic,</span><br><span>         struct stasis_subscription *sub);</span><br><span>@@ -421,17 +436,36 @@</span><br><span> }</span><br><span> #endif</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+void stasis_topic_release(struct stasis_topic *topic)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!topic) {</span><br><span style="color: hsl(120, 100%, 40%);">+         return;</span><br><span style="color: hsl(120, 100%, 40%);">+       }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   ao2_unlink(topic_all, topic);</span><br><span style="color: hsl(120, 100%, 40%);">+ ao2_ref(topic, -1);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+ return;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> struct stasis_topic *stasis_topic_create(const char *name)</span><br><span> {</span><br><span>      struct stasis_topic *topic;</span><br><span style="color: hsl(120, 100%, 40%);">+   char buf[36 + 1];</span><br><span>    int res = 0;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        topic = ao2_t_alloc(sizeof(*topic) + strlen(name) + 1, topic_dtor, name);</span><br><span style="color: hsl(120, 100%, 40%);">+     ast_uuid_generate_str(buf, sizeof(buf));</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    topic = ao2_t_alloc(sizeof(*topic) + strlen(name) + 1 + sizeof(buf) + 1, topic_dtor, name);</span><br><span>  if (!topic) {</span><br><span>                return NULL;</span><br><span>         }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ topic->name = topic->buf;</span><br><span style="color: hsl(120, 100%, 40%);">+       topic->uniqueid = topic->buf + strlen(name) + 1;</span><br><span>       strcpy(topic->name, name); /* SAFE */</span><br><span style="color: hsl(120, 100%, 40%);">+      strcpy(topic->uniqueid, buf);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>   res |= AST_VECTOR_INIT(&topic->subscribers, INITIAL_SUBSCRIBERS_MAX);</span><br><span>         res |= AST_VECTOR_INIT(&topic->upstream_topics, 0);</span><br><span> #ifdef AST_DEVMODE</span><br><span>@@ -445,9 +479,17 @@</span><br><span>              return NULL;</span><br><span>         }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       ao2_link(topic_all, topic);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span>        return topic;</span><br><span> }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+struct stasis_topic *stasis_topic_get_by_name(const char *name)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    return ao2_find(topic_all, name, OBJ_SEARCH_KEY);</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> const char *stasis_topic_name(const struct stasis_topic *topic)</span><br><span> {</span><br><span>       return topic->name;</span><br><span>@@ -533,7 +575,7 @@</span><br><span>          * be bad. */</span><br><span>        ast_assert(stasis_subscription_is_done(sub));</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-       ao2_cleanup(sub->topic);</span><br><span style="color: hsl(120, 100%, 40%);">+   stasis_topic_release(sub->topic);</span><br><span>         sub->topic = NULL;</span><br><span>        ast_taskprocessor_unreference(sub->mailbox);</span><br><span>      sub->mailbox = NULL;</span><br><span>@@ -2067,6 +2109,57 @@</span><br><span> </span><br><span> /*! @} */</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+/*!</span><br><span style="color: hsl(120, 100%, 40%);">+ * \internal</span><br><span style="color: hsl(120, 100%, 40%);">+ * \brief CLI command implementation for 'stasis show topics'</span><br><span style="color: hsl(120, 100%, 40%);">+ */</span><br><span style="color: hsl(120, 100%, 40%);">+static char *stasis_show_topics(struct ast_cli_entry *e, int cmd, struct ast_cli_args *a)</span><br><span style="color: hsl(120, 100%, 40%);">+{</span><br><span style="color: hsl(120, 100%, 40%);">+    struct ao2_iterator iter;</span><br><span style="color: hsl(120, 100%, 40%);">+     struct stasis_topic *topic;</span><br><span style="color: hsl(120, 100%, 40%);">+   int count = 0;</span><br><span style="color: hsl(120, 100%, 40%);">+#define FMT_HEADERS             "%-64s %-64s\n"</span><br><span style="color: hsl(120, 100%, 40%);">+#define FMT_FIELDS           "%-64s %-64s\n"</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   switch (cmd) {</span><br><span style="color: hsl(120, 100%, 40%);">+        case CLI_INIT:</span><br><span style="color: hsl(120, 100%, 40%);">+                e->command = "stasis show topics";</span><br><span style="color: hsl(120, 100%, 40%);">+               e->usage =</span><br><span style="color: hsl(120, 100%, 40%);">+                 "Usage: stasis show topics\n"</span><br><span style="color: hsl(120, 100%, 40%);">+                       "  Shows a list of topics\n";</span><br><span style="color: hsl(120, 100%, 40%);">+               return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  case CLI_GENERATE:</span><br><span style="color: hsl(120, 100%, 40%);">+            return NULL;</span><br><span style="color: hsl(120, 100%, 40%);">+  }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (a->argc != e->args) {</span><br><span style="color: hsl(120, 100%, 40%);">+               return CLI_SHOWUSAGE;</span><br><span style="color: hsl(120, 100%, 40%);">+ }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   ast_cli(a->fd, "\n" FMT_HEADERS, "Name", "Uniqueid");</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+      iter = ao2_iterator_init(topic_all, 0);</span><br><span style="color: hsl(120, 100%, 40%);">+       while ((topic = ao2_iterator_next(&iter))) {</span><br><span style="color: hsl(120, 100%, 40%);">+              ast_cli(a->fd, FMT_FIELDS, topic->name, topic->uniqueid);</span><br><span style="color: hsl(120, 100%, 40%);">+            ao2_ref(topic, -1);</span><br><span style="color: hsl(120, 100%, 40%);">+           ++count;</span><br><span style="color: hsl(120, 100%, 40%);">+      }</span><br><span style="color: hsl(120, 100%, 40%);">+     ao2_iterator_destroy(&iter);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+    ast_cli(a->fd, "\n%d Total topics\n\n", count);</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+#undef FMT_HEADERS</span><br><span style="color: hsl(120, 100%, 40%);">+#undef FMT_FIELDS</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+       return CLI_SUCCESS;</span><br><span style="color: hsl(120, 100%, 40%);">+}</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+static struct ast_cli_entry cli_stasis[] = {</span><br><span style="color: hsl(120, 100%, 40%);">+      AST_CLI_DEFINE(stasis_show_topics, "Show all topics"),</span><br><span style="color: hsl(120, 100%, 40%);">+};</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #ifdef AST_DEVMODE</span><br><span> </span><br><span> /*!</span><br><span>@@ -2519,6 +2612,9 @@</span><br><span>    ao2_cleanup(subscription_statistics);</span><br><span>        ao2_cleanup(topic_statistics);</span><br><span> #endif</span><br><span style="color: hsl(120, 100%, 40%);">+      ast_cli_unregister_multiple(cli_stasis, ARRAY_LEN(cli_stasis));</span><br><span style="color: hsl(120, 100%, 40%);">+       ao2_cleanup(topic_all);</span><br><span style="color: hsl(120, 100%, 40%);">+       topic_all = NULL;</span><br><span>    ast_threadpool_shutdown(pool);</span><br><span>       pool = NULL;</span><br><span>         STASIS_MESSAGE_TYPE_CLEANUP(stasis_subscription_change_type);</span><br><span>@@ -2613,6 +2709,16 @@</span><br><span>               return -1;</span><br><span>   }</span><br><span> </span><br><span style="color: hsl(120, 100%, 40%);">+ topic_all = ao2_container_alloc_hash(AO2_ALLOC_OPT_LOCK_MUTEX, 0, TOPIC_ALL_BUCKETS,</span><br><span style="color: hsl(120, 100%, 40%);">+                  stasis_topic_hash_fn, 0, stasis_topic_cmp_fn);</span><br><span style="color: hsl(120, 100%, 40%);">+        if (!topic_all) {</span><br><span style="color: hsl(120, 100%, 40%);">+             return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span style="color: hsl(120, 100%, 40%);">+   if (ast_cli_register_multiple(cli_stasis, ARRAY_LEN(cli_stasis))) {</span><br><span style="color: hsl(120, 100%, 40%);">+           return -1;</span><br><span style="color: hsl(120, 100%, 40%);">+    }</span><br><span style="color: hsl(120, 100%, 40%);">+</span><br><span> #ifdef AST_DEVMODE</span><br><span>    /* Statistics information is stored separately so that we don't alter or interrupt the lifetime of the underlying</span><br><span>         * topic or subscripton.</span><br><span>diff --git a/main/stasis_bridges.c b/main/stasis_bridges.c</span><br><span>index bed28ba..f84aaa5 100644</span><br><span>--- a/main/stasis_bridges.c</span><br><span>+++ b/main/stasis_bridges.c</span><br><span>@@ -1353,7 +1353,7 @@</span><br><span> </span><br><span>        ao2_cleanup(bridge_topic_pool);</span><br><span>      bridge_topic_pool = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-       ao2_cleanup(bridge_topic_all);</span><br><span style="color: hsl(120, 100%, 40%);">+        stasis_topic_release(bridge_topic_all);</span><br><span>      bridge_topic_all = NULL;</span><br><span> }</span><br><span> </span><br><span>diff --git a/main/stasis_cache.c b/main/stasis_cache.c</span><br><span>index ee8a1dd..3f95ff3 100644</span><br><span>--- a/main/stasis_cache.c</span><br><span>+++ b/main/stasis_cache.c</span><br><span>@@ -76,7 +76,7 @@</span><br><span>       caching_topic->sub = NULL;</span><br><span>        ao2_cleanup(caching_topic->cache);</span><br><span>        caching_topic->cache = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">- ao2_cleanup(caching_topic->topic);</span><br><span style="color: hsl(120, 100%, 40%);">+ stasis_topic_release(caching_topic->topic);</span><br><span>       caching_topic->topic = NULL;</span><br><span>      ao2_cleanup(caching_topic->original_topic);</span><br><span>       caching_topic->original_topic = NULL;</span><br><span>diff --git a/main/stasis_cache_pattern.c b/main/stasis_cache_pattern.c</span><br><span>index 04d8164..14a8c8e 100644</span><br><span>--- a/main/stasis_cache_pattern.c</span><br><span>+++ b/main/stasis_cache_pattern.c</span><br><span>@@ -52,9 +52,9 @@</span><br><span> {</span><br><span>   struct stasis_cp_all *all = obj;</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-    ao2_cleanup(all->topic);</span><br><span style="color: hsl(120, 100%, 40%);">+   stasis_topic_release(all->topic);</span><br><span>         all->topic = NULL;</span><br><span style="color: hsl(0, 100%, 40%);">-   ao2_cleanup(all->topic_cached);</span><br><span style="color: hsl(120, 100%, 40%);">+    stasis_topic_release(all->topic_cached);</span><br><span>  all->topic_cached = NULL;</span><br><span>         ao2_cleanup(all->cache);</span><br><span>  all->cache = NULL;</span><br><span>@@ -131,7 +131,7 @@</span><br><span>  ast_assert(one->forward_topic_to_all == NULL);</span><br><span>    ast_assert(one->forward_cached_to_all == NULL);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-  ao2_cleanup(one->topic);</span><br><span style="color: hsl(120, 100%, 40%);">+   stasis_topic_release(one->topic);</span><br><span>         one->topic = NULL;</span><br><span> }</span><br><span> </span><br><span>diff --git a/main/stasis_channels.c b/main/stasis_channels.c</span><br><span>index d39fb08..28b6157 100644</span><br><span>--- a/main/stasis_channels.c</span><br><span>+++ b/main/stasis_channels.c</span><br><span>@@ -1623,7 +1623,7 @@</span><br><span> </span><br><span> static void stasis_channels_cleanup(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       ao2_cleanup(channel_topic_all);</span><br><span style="color: hsl(120, 100%, 40%);">+       stasis_topic_release(channel_topic_all);</span><br><span>     channel_topic_all = NULL;</span><br><span>    ao2_cleanup(channel_cache);</span><br><span>  channel_cache = NULL;</span><br><span>diff --git a/main/stasis_system.c b/main/stasis_system.c</span><br><span>index 961a2b0..3adec12 100644</span><br><span>--- a/main/stasis_system.c</span><br><span>+++ b/main/stasis_system.c</span><br><span>@@ -352,7 +352,7 @@</span><br><span> /*! \brief Cleanup the \ref stasis system level items */</span><br><span> static void stasis_system_cleanup(void)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-    ao2_cleanup(system_topic);</span><br><span style="color: hsl(120, 100%, 40%);">+    stasis_topic_release(system_topic);</span><br><span>  system_topic = NULL;</span><br><span>         STASIS_MESSAGE_TYPE_CLEANUP(ast_network_change_type);</span><br><span>        STASIS_MESSAGE_TYPE_CLEANUP(ast_system_registry_type);</span><br><span>diff --git a/main/test.c b/main/test.c</span><br><span>index 2abe698..38093a3 100644</span><br><span>--- a/main/test.c</span><br><span>+++ b/main/test.c</span><br><span>@@ -1212,7 +1212,7 @@</span><br><span> {</span><br><span>         AST_TEST_UNREGISTER(test_registrations);</span><br><span>     ast_cli_unregister_multiple(test_cli, ARRAY_LEN(test_cli));</span><br><span style="color: hsl(0, 100%, 40%);">-     ao2_cleanup(test_suite_topic);</span><br><span style="color: hsl(120, 100%, 40%);">+        stasis_topic_release(test_suite_topic);</span><br><span>      test_suite_topic = NULL;</span><br><span>     STASIS_MESSAGE_TYPE_CLEANUP(ast_test_suite_message_type);</span><br><span> }</span><br><span>diff --git a/res/res_corosync.c b/res/res_corosync.c</span><br><span>index bf172e3..4f33dde 100644</span><br><span>--- a/res/res_corosync.c</span><br><span>+++ b/res/res_corosync.c</span><br><span>@@ -1074,7 +1074,7 @@</span><br><span>  }</span><br><span> </span><br><span>        if (corosync_aggregate_topic) {</span><br><span style="color: hsl(0, 100%, 40%);">-         ao2_t_ref(corosync_aggregate_topic, -1, "Dispose of topic on cleanup");</span><br><span style="color: hsl(120, 100%, 40%);">+             stasis_topic_release(corosync_aggregate_topic);</span><br><span>              corosync_aggregate_topic = NULL;</span><br><span>     }</span><br><span> </span><br><span>diff --git a/res/stasis/app.c b/res/stasis/app.c</span><br><span>index 585edda..2ee73a2 100644</span><br><span>--- a/res/stasis/app.c</span><br><span>+++ b/res/stasis/app.c</span><br><span>@@ -290,7 +290,7 @@</span><br><span>     ast_assert(app->bridge_router == NULL);</span><br><span>   ast_assert(app->endpoint_router == NULL);</span><br><span> </span><br><span style="color: hsl(0, 100%, 40%);">-        ao2_cleanup(app->topic);</span><br><span style="color: hsl(120, 100%, 40%);">+   stasis_topic_release(app->topic);</span><br><span>         app->topic = NULL;</span><br><span>        ao2_cleanup(app->forwards);</span><br><span>       app->forwards = NULL;</span><br><span>diff --git a/tests/test_stasis.c b/tests/test_stasis.c</span><br><span>index e620039..1c5fd30 100644</span><br><span>--- a/tests/test_stasis.c</span><br><span>+++ b/tests/test_stasis.c</span><br><span>@@ -313,7 +313,7 @@</span><br><span> </span><br><span> AST_TEST_DEFINE(subscription_messages)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      RAII_VAR(struct stasis_topic *, topic, NULL, ao2_cleanup);</span><br><span style="color: hsl(120, 100%, 40%);">+    RAII_VAR(struct stasis_topic *, topic, NULL, stasis_topic_release);</span><br><span>  RAII_VAR(struct stasis_subscription *, uut, NULL, stasis_unsubscribe);</span><br><span>       RAII_VAR(char *, test_data, NULL, ao2_cleanup);</span><br><span>      RAII_VAR(struct stasis_message_type *, test_message_type, NULL, ao2_cleanup);</span><br><span>@@ -368,7 +368,7 @@</span><br><span> </span><br><span> AST_TEST_DEFINE(subscription_pool_messages)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     RAII_VAR(struct stasis_topic *, topic, NULL, ao2_cleanup);</span><br><span style="color: hsl(120, 100%, 40%);">+    RAII_VAR(struct stasis_topic *, topic, NULL, stasis_topic_release);</span><br><span>  RAII_VAR(struct stasis_subscription *, uut, NULL, stasis_unsubscribe);</span><br><span>       RAII_VAR(char *, test_data, NULL, ao2_cleanup);</span><br><span>      RAII_VAR(struct stasis_message_type *, test_message_type, NULL, ao2_cleanup);</span><br><span>@@ -423,7 +423,7 @@</span><br><span> </span><br><span> AST_TEST_DEFINE(publish)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        RAII_VAR(struct stasis_topic *, topic, NULL, ao2_cleanup);</span><br><span style="color: hsl(120, 100%, 40%);">+    RAII_VAR(struct stasis_topic *, topic, NULL, stasis_topic_release);</span><br><span>  RAII_VAR(struct stasis_subscription *, uut, NULL, stasis_unsubscribe);</span><br><span>       RAII_VAR(char *, test_data, NULL, ao2_cleanup);</span><br><span>      RAII_VAR(struct stasis_message_type *, test_message_type, NULL, ao2_cleanup);</span><br><span>@@ -470,7 +470,7 @@</span><br><span> </span><br><span> AST_TEST_DEFINE(publish_sync)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   RAII_VAR(struct stasis_topic *, topic, NULL, ao2_cleanup);</span><br><span style="color: hsl(120, 100%, 40%);">+    RAII_VAR(struct stasis_topic *, topic, NULL, stasis_topic_release);</span><br><span>  RAII_VAR(struct stasis_subscription *, uut, NULL, stasis_unsubscribe);</span><br><span>       RAII_VAR(char *, test_data, NULL, ao2_cleanup);</span><br><span>      RAII_VAR(struct stasis_message_type *, test_message_type, NULL, ao2_cleanup);</span><br><span>@@ -517,7 +517,7 @@</span><br><span> </span><br><span> AST_TEST_DEFINE(publish_pool)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-   RAII_VAR(struct stasis_topic *, topic, NULL, ao2_cleanup);</span><br><span style="color: hsl(120, 100%, 40%);">+    RAII_VAR(struct stasis_topic *, topic, NULL, stasis_topic_release);</span><br><span>  RAII_VAR(struct stasis_subscription *, uut, NULL, stasis_unsubscribe);</span><br><span>       RAII_VAR(char *, test_data, NULL, ao2_cleanup);</span><br><span>      RAII_VAR(struct stasis_message_type *, test_message_type, NULL, ao2_cleanup);</span><br><span>@@ -566,7 +566,7 @@</span><br><span> </span><br><span> AST_TEST_DEFINE(unsubscribe_stops_messages)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     RAII_VAR(struct stasis_topic *, topic, NULL, ao2_cleanup);</span><br><span style="color: hsl(120, 100%, 40%);">+    RAII_VAR(struct stasis_topic *, topic, NULL, stasis_topic_release);</span><br><span>  RAII_VAR(struct consumer *, consumer, NULL, ao2_cleanup);</span><br><span>    RAII_VAR(struct stasis_subscription *, uut, NULL, stasis_unsubscribe);</span><br><span>       RAII_VAR(char *, test_data, NULL, ao2_cleanup);</span><br><span>@@ -612,8 +612,8 @@</span><br><span> </span><br><span> AST_TEST_DEFINE(forward)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-      RAII_VAR(struct stasis_topic *, parent_topic, NULL, ao2_cleanup);</span><br><span style="color: hsl(0, 100%, 40%);">-       RAII_VAR(struct stasis_topic *, topic, NULL, ao2_cleanup);</span><br><span style="color: hsl(120, 100%, 40%);">+    RAII_VAR(struct stasis_topic *, parent_topic, NULL, stasis_topic_release);</span><br><span style="color: hsl(120, 100%, 40%);">+    RAII_VAR(struct stasis_topic *, topic, NULL, stasis_topic_release);</span><br><span> </span><br><span>      RAII_VAR(struct consumer *, parent_consumer, NULL, ao2_cleanup);</span><br><span>     RAII_VAR(struct consumer *, consumer, NULL, ao2_cleanup);</span><br><span>@@ -678,9 +678,9 @@</span><br><span> </span><br><span> AST_TEST_DEFINE(interleaving)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-       RAII_VAR(struct stasis_topic *, parent_topic, NULL, ao2_cleanup);</span><br><span style="color: hsl(0, 100%, 40%);">-       RAII_VAR(struct stasis_topic *, topic1, NULL, ao2_cleanup);</span><br><span style="color: hsl(0, 100%, 40%);">-     RAII_VAR(struct stasis_topic *, topic2, NULL, ao2_cleanup);</span><br><span style="color: hsl(120, 100%, 40%);">+   RAII_VAR(struct stasis_topic *, parent_topic, NULL, stasis_topic_release);</span><br><span style="color: hsl(120, 100%, 40%);">+    RAII_VAR(struct stasis_topic *, topic1, NULL, stasis_topic_release);</span><br><span style="color: hsl(120, 100%, 40%);">+  RAII_VAR(struct stasis_topic *, topic2, NULL, stasis_topic_release);</span><br><span> </span><br><span>     RAII_VAR(struct stasis_message_type *, test_message_type, NULL, ao2_cleanup);</span><br><span> </span><br><span>@@ -761,9 +761,9 @@</span><br><span> </span><br><span> AST_TEST_DEFINE(subscription_interleaving)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  RAII_VAR(struct stasis_topic *, parent_topic, NULL, ao2_cleanup);</span><br><span style="color: hsl(0, 100%, 40%);">-       RAII_VAR(struct stasis_topic *, topic1, NULL, ao2_cleanup);</span><br><span style="color: hsl(0, 100%, 40%);">-     RAII_VAR(struct stasis_topic *, topic2, NULL, ao2_cleanup);</span><br><span style="color: hsl(120, 100%, 40%);">+   RAII_VAR(struct stasis_topic *, parent_topic, NULL, stasis_topic_release);</span><br><span style="color: hsl(120, 100%, 40%);">+    RAII_VAR(struct stasis_topic *, topic1, NULL, stasis_topic_release);</span><br><span style="color: hsl(120, 100%, 40%);">+  RAII_VAR(struct stasis_topic *, topic2, NULL, stasis_topic_release);</span><br><span> </span><br><span>     RAII_VAR(struct stasis_message_type *, test_message_type, NULL, ao2_cleanup);</span><br><span> </span><br><span>@@ -986,7 +986,7 @@</span><br><span> AST_TEST_DEFINE(cache_filter)</span><br><span> {</span><br><span>        RAII_VAR(struct stasis_message_type *, non_cache_type, NULL, ao2_cleanup);</span><br><span style="color: hsl(0, 100%, 40%);">-      RAII_VAR(struct stasis_topic *, topic, NULL, ao2_cleanup);</span><br><span style="color: hsl(120, 100%, 40%);">+    RAII_VAR(struct stasis_topic *, topic, NULL, stasis_topic_release);</span><br><span>  RAII_VAR(struct stasis_cache *, cache, NULL, ao2_cleanup);</span><br><span>   RAII_VAR(struct stasis_caching_topic *, caching_topic, NULL, stasis_caching_unsubscribe);</span><br><span>    RAII_VAR(struct consumer *, consumer, NULL, ao2_cleanup);</span><br><span>@@ -1033,7 +1033,7 @@</span><br><span> AST_TEST_DEFINE(cache)</span><br><span> {</span><br><span>     RAII_VAR(struct stasis_message_type *, cache_type, NULL, ao2_cleanup);</span><br><span style="color: hsl(0, 100%, 40%);">-  RAII_VAR(struct stasis_topic *, topic, NULL, ao2_cleanup);</span><br><span style="color: hsl(120, 100%, 40%);">+    RAII_VAR(struct stasis_topic *, topic, NULL, stasis_topic_release);</span><br><span>  RAII_VAR(struct stasis_cache *, cache, NULL, ao2_cleanup);</span><br><span>   RAII_VAR(struct stasis_caching_topic *, caching_topic, NULL, stasis_caching_unsubscribe);</span><br><span>    RAII_VAR(struct consumer *, consumer, NULL, ao2_cleanup);</span><br><span>@@ -1132,7 +1132,7 @@</span><br><span> AST_TEST_DEFINE(cache_dump)</span><br><span> {</span><br><span>        RAII_VAR(struct stasis_message_type *, cache_type, NULL, ao2_cleanup);</span><br><span style="color: hsl(0, 100%, 40%);">-  RAII_VAR(struct stasis_topic *, topic, NULL, ao2_cleanup);</span><br><span style="color: hsl(120, 100%, 40%);">+    RAII_VAR(struct stasis_topic *, topic, NULL, stasis_topic_release);</span><br><span>  RAII_VAR(struct stasis_cache *, cache, NULL, ao2_cleanup);</span><br><span>   RAII_VAR(struct stasis_caching_topic *, caching_topic, NULL, stasis_caching_unsubscribe);</span><br><span>    RAII_VAR(struct consumer *, consumer, NULL, ao2_cleanup);</span><br><span>@@ -1245,7 +1245,7 @@</span><br><span> AST_TEST_DEFINE(cache_eid_aggregate)</span><br><span> {</span><br><span>       RAII_VAR(struct stasis_message_type *, cache_type, NULL, ao2_cleanup);</span><br><span style="color: hsl(0, 100%, 40%);">-  RAII_VAR(struct stasis_topic *, topic, NULL, ao2_cleanup);</span><br><span style="color: hsl(120, 100%, 40%);">+    RAII_VAR(struct stasis_topic *, topic, NULL, stasis_topic_release);</span><br><span>  RAII_VAR(struct stasis_cache *, cache, NULL, ao2_cleanup);</span><br><span>   RAII_VAR(struct stasis_caching_topic *, caching_topic, NULL, stasis_caching_unsubscribe);</span><br><span>    RAII_VAR(struct consumer *, cache_consumer, NULL, ao2_cleanup);</span><br><span>@@ -1504,7 +1504,7 @@</span><br><span> </span><br><span> AST_TEST_DEFINE(router)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-     RAII_VAR(struct stasis_topic *, topic, NULL, ao2_cleanup);</span><br><span style="color: hsl(120, 100%, 40%);">+    RAII_VAR(struct stasis_topic *, topic, NULL, stasis_topic_release);</span><br><span>  RAII_VAR(struct stasis_message_router *, uut, NULL, stasis_message_router_unsubscribe_and_join);</span><br><span>     RAII_VAR(char *, test_data, NULL, ao2_cleanup);</span><br><span>      RAII_VAR(struct stasis_message_type *, test_message_type1, NULL, ao2_cleanup);</span><br><span>@@ -1600,7 +1600,7 @@</span><br><span> </span><br><span> AST_TEST_DEFINE(router_pool)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">- RAII_VAR(struct stasis_topic *, topic, NULL, ao2_cleanup);</span><br><span style="color: hsl(120, 100%, 40%);">+    RAII_VAR(struct stasis_topic *, topic, NULL, stasis_topic_release);</span><br><span>  RAII_VAR(struct stasis_message_router *, uut, NULL, stasis_message_router_unsubscribe_and_join);</span><br><span>     RAII_VAR(char *, test_data, NULL, ao2_cleanup);</span><br><span>      RAII_VAR(struct stasis_message_type *, test_message_type1, NULL, ao2_cleanup);</span><br><span>@@ -1709,7 +1709,7 @@</span><br><span> </span><br><span> AST_TEST_DEFINE(router_cache_updates)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-        RAII_VAR(struct stasis_topic *, topic, NULL, ao2_cleanup);</span><br><span style="color: hsl(120, 100%, 40%);">+    RAII_VAR(struct stasis_topic *, topic, NULL, stasis_topic_release);</span><br><span>  RAII_VAR(struct stasis_cache *, cache, NULL, ao2_cleanup);</span><br><span>   RAII_VAR(struct stasis_caching_topic *, caching_topic, NULL, stasis_caching_unsubscribe_and_join);</span><br><span>   RAII_VAR(struct stasis_message_type *, test_message_type1, NULL, ao2_cleanup);</span><br><span>@@ -1967,7 +1967,7 @@</span><br><span> </span><br><span> AST_TEST_DEFINE(dtor_order)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  RAII_VAR(struct stasis_topic *, topic, NULL, ao2_cleanup);</span><br><span style="color: hsl(120, 100%, 40%);">+    RAII_VAR(struct stasis_topic *, topic, NULL, stasis_topic_release);</span><br><span>  RAII_VAR(struct stasis_subscription *, sub, NULL, stasis_unsubscribe);</span><br><span> </span><br><span>   switch (cmd) {</span><br><span>@@ -2005,7 +2005,7 @@</span><br><span> </span><br><span> AST_TEST_DEFINE(caching_dtor_order)</span><br><span> {</span><br><span style="color: hsl(0, 100%, 40%);">-  RAII_VAR(struct stasis_topic *, topic, NULL, ao2_cleanup);</span><br><span style="color: hsl(120, 100%, 40%);">+    RAII_VAR(struct stasis_topic *, topic, NULL, stasis_topic_release);</span><br><span>  RAII_VAR(struct stasis_cache *, cache, NULL, ao2_cleanup);</span><br><span>   RAII_VAR(struct stasis_caching_topic *, caching_topic, NULL,</span><br><span>                 stasis_caching_unsubscribe);</span><br><span>@@ -2147,7 +2147,7 @@</span><br><span>         struct cts *c = obj;</span><br><span> </span><br><span>     stasis_unsubscribe(c->sub);</span><br><span style="color: hsl(0, 100%, 40%);">-  ao2_cleanup(c->topic);</span><br><span style="color: hsl(120, 100%, 40%);">+     stasis_topic_release(c->topic);</span><br><span>   ao2_cleanup(c->consumer);</span><br><span> }</span><br><span> </span><br><span></span><br></pre><p>To view, visit <a href="https://gerrit.asterisk.org/10929">change 10929</a>. To unsubscribe, or for help writing mail filters, visit <a href="https://gerrit.asterisk.org/settings">settings</a>.</p><div itemscope itemtype="http://schema.org/EmailMessage"><div itemscope itemprop="action" itemtype="http://schema.org/ViewAction"><link itemprop="url" href="https://gerrit.asterisk.org/10929"/><meta itemprop="name" content="View Change"/></div></div>

<div style="display:none"> Gerrit-Project: asterisk </div>
<div style="display:none"> Gerrit-Branch: master </div>
<div style="display:none"> Gerrit-MessageType: newchange </div>
<div style="display:none"> Gerrit-Change-Id: Ie86d125d2966f93de74ee00f47ae6fbc8c081c5f </div>
<div style="display:none"> Gerrit-Change-Number: 10929 </div>
<div style="display:none"> Gerrit-PatchSet: 1 </div>
<div style="display:none"> Gerrit-Owner: sungtae kim <pchero21@gmail.com> </div>