diff options
author | Joshua Colp <jcolp@digium.com> | 2015-09-17 12:16:00 -0500 |
---|---|---|
committer | Gerrit Code Review <gerrit2@gerrit.digium.api> | 2015-09-17 12:16:00 -0500 |
commit | a665b3128177fc87036d7eb8b3174ac85e791d22 (patch) | |
tree | 778cc2c6a8f2eed92eaf1a60feabb51344afd18d | |
parent | 5c713fdf18ffa934e0cac8ddb29e4ad95a68200b (diff) | |
parent | fe5077b1f8caed2df419e1bd7b872657b7def726 (diff) |
Merge "res_pjsip_pubsub: Eliminate race during initial NOTIFY." into 13
-rw-r--r-- | res/res_pjsip_pubsub.c | 33 |
1 files changed, 23 insertions, 10 deletions
diff --git a/res/res_pjsip_pubsub.c b/res/res_pjsip_pubsub.c index cf94b04a9..eb49aafd8 100644 --- a/res/res_pjsip_pubsub.c +++ b/res/res_pjsip_pubsub.c @@ -1306,7 +1306,7 @@ static struct sip_subscription_tree *create_subscription_tree(const struct ast_s return sub_tree; } -static int generate_initial_notify(struct ast_sip_subscription *sub); +static int initial_notify_task(void *obj); static int send_notify(struct sip_subscription_tree *sub_tree, unsigned int force_full_state); /*! \brief Callback function to perform the actual recreation of a subscription */ @@ -1404,10 +1404,9 @@ static int subscription_persistence_recreate(void *obj, void *arg, int flags) } sub_tree->persistence = ao2_bump(persistence); subscription_persistence_update(sub_tree, &rdata); - if (generate_initial_notify(sub_tree->root)) { + if (ast_sip_push_task(sub_tree->serializer, initial_notify_task, ao2_bump(sub_tree))) { pjsip_evsub_terminate(sub_tree->evsub, PJ_TRUE); - } else { - send_notify(sub_tree, 1); + ao2_ref(sub_tree, -1); } } else { ast_sorcery_delete(ast_sip_get_sorcery(), persistence); @@ -2545,6 +2544,24 @@ static int generate_initial_notify(struct ast_sip_subscription *sub) return res; } +static int initial_notify_task(void * obj) +{ + struct sip_subscription_tree *sub_tree; + + sub_tree = obj; + if (generate_initial_notify(sub_tree->root)) { + pjsip_evsub_terminate(sub_tree->evsub, PJ_TRUE); + } else { + send_notify(sub_tree, 1); + ast_test_suite_event_notify("SUBSCRIPTION_ESTABLISHED", + "Resource: %s", + sub_tree->root->resource); + } + + ao2_ref(sub_tree, -1); + return 0; +} + static pj_bool_t pubsub_on_rx_subscribe_request(pjsip_rx_data *rdata) { pjsip_expires_hdr *expires_header; @@ -2632,13 +2649,9 @@ static pj_bool_t pubsub_on_rx_subscribe_request(pjsip_rx_data *rdata) sub_tree->persistence = subscription_persistence_create(sub_tree); subscription_persistence_update(sub_tree, rdata); sip_subscription_accept(sub_tree, rdata, resp); - if (generate_initial_notify(sub_tree->root)) { + if (ast_sip_push_task(sub_tree->serializer, initial_notify_task, ao2_bump(sub_tree))) { pjsip_evsub_terminate(sub_tree->evsub, PJ_TRUE); - } else { - send_notify(sub_tree, 1); - ast_test_suite_event_notify("SUBSCRIPTION_ESTABLISHED", - "Resource: %s", - sub_tree->root->resource); + ao2_ref(sub_tree, -1); } } |