summaryrefslogtreecommitdiff
path: root/main/stasis_cache_pattern.c
diff options
context:
space:
mode:
Diffstat (limited to 'main/stasis_cache_pattern.c')
-rw-r--r--main/stasis_cache_pattern.c49
1 files changed, 40 insertions, 9 deletions
diff --git a/main/stasis_cache_pattern.c b/main/stasis_cache_pattern.c
index 9e3de367a..ccc9ebf08 100644
--- a/main/stasis_cache_pattern.c
+++ b/main/stasis_cache_pattern.c
@@ -138,6 +138,30 @@ struct stasis_cp_single *stasis_cp_single_create(struct stasis_cp_all *all,
{
RAII_VAR(struct stasis_cp_single *, one, NULL, ao2_cleanup);
+ one = stasis_cp_single_create_only(all, name);
+ if (!one) {
+ return NULL;
+ }
+
+ one->forward_topic_to_all = stasis_forward_all(one->topic, all->topic);
+ if (!one->forward_topic_to_all) {
+ return NULL;
+ }
+ one->forward_cached_to_all = stasis_forward_all(
+ stasis_caching_get_topic(one->topic_cached), all->topic_cached);
+ if (!one->forward_cached_to_all) {
+ return NULL;
+ }
+
+ ao2_ref(one, +1);
+ return one;
+}
+
+struct stasis_cp_single *stasis_cp_single_create_only(struct stasis_cp_all *all,
+ const char *name)
+{
+ RAII_VAR(struct stasis_cp_single *, one, NULL, ao2_cleanup);
+
one = ao2_t_alloc(sizeof(*one), one_dtor, name);
if (!one) {
return NULL;
@@ -152,18 +176,25 @@ struct stasis_cp_single *stasis_cp_single_create(struct stasis_cp_all *all,
return NULL;
}
- one->forward_topic_to_all = stasis_forward_all(one->topic, all->topic);
- if (!one->forward_topic_to_all) {
- return NULL;
+ ao2_ref(one, +1);
+ return one;
+}
+
+int stasis_cp_single_forward(struct stasis_cp_single *from, struct stasis_cp_single *to)
+{
+ from->forward_topic_to_all = stasis_forward_all(from->topic, to->topic);
+ if (!from->forward_topic_to_all) {
+ return -1;;
}
- one->forward_cached_to_all = stasis_forward_all(
- stasis_caching_get_topic(one->topic_cached), all->topic_cached);
- if (!one->forward_cached_to_all) {
- return NULL;
+
+ from->forward_cached_to_all = stasis_forward_all(
+ stasis_caching_get_topic(from->topic_cached),
+ stasis_caching_get_topic(to->topic_cached));
+ if (!from->forward_cached_to_all) {
+ return -1;
}
- ao2_ref(one, +1);
- return one;
+ return 0;
}
void stasis_cp_single_unsubscribe(struct stasis_cp_single *one)