summaryrefslogtreecommitdiff
path: root/main/stasis_cache.c
diff options
context:
space:
mode:
Diffstat (limited to 'main/stasis_cache.c')
-rw-r--r--main/stasis_cache.c19
1 files changed, 13 insertions, 6 deletions
diff --git a/main/stasis_cache.c b/main/stasis_cache.c
index 5757c869a..17be90111 100644
--- a/main/stasis_cache.c
+++ b/main/stasis_cache.c
@@ -76,9 +76,19 @@ struct stasis_topic *stasis_caching_get_topic(struct stasis_caching_topic *cachi
struct stasis_caching_topic *stasis_caching_unsubscribe(struct stasis_caching_topic *caching_topic)
{
if (caching_topic) {
+ RAII_VAR(struct stasis_caching_topic *, hold_ref, NULL,
+ ao2_cleanup);
+
+ /* The subscription may hold the last reference to this caching
+ * topic, but we want to make sure the unsubscribe finishes
+ * before kicking of the caching topic's dtor.
+ */
+ ao2_ref(caching_topic, +1);
+ hold_ref = caching_topic;
+
if (stasis_subscription_is_subscribed(caching_topic->sub)) {
/* Increment the reference to hold on to it past the
- * unsubscribe */
+ * unsubscribe. Will be cleaned up in dtor. */
ao2_ref(caching_topic->sub, +1);
stasis_unsubscribe(caching_topic->sub);
} else {
@@ -389,6 +399,7 @@ static void caching_topic_exec(void *data, struct stasis_subscription *sub, stru
struct stasis_caching_topic *caching_topic = data;
const char *id = NULL;
+ ast_assert(caching_topic != NULL);
ast_assert(caching_topic->topic != NULL);
ast_assert(caching_topic->id_fn != NULL);
@@ -451,10 +462,6 @@ static void caching_topic_exec(void *data, struct stasis_subscription *sub, stru
stasis_publish(caching_topic->topic, update);
}
-
- if (stasis_subscription_final_message(sub, message)) {
- ao2_cleanup(caching_topic);
- }
}
struct stasis_caching_topic *stasis_caching_topic_create(struct stasis_topic *original_topic, snapshot_get_id id_fn)
@@ -499,7 +506,7 @@ struct stasis_caching_topic *stasis_caching_topic_create(struct stasis_topic *or
ao2_ref(caching_topic, +1);
caching_topic->sub = sub;
- ao2_ref(caching_topic, +1);
+ /* The subscription holds the reference, so no additional ref bump. */
return caching_topic;
}