summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoshua Colp <jcolp@digium.com>2017-03-18 05:38:32 -0500
committerGerrit Code Review <gerrit2@gerrit.digium.api>2017-03-18 05:38:32 -0500
commitbaeabb82eaa92a9d493ae92b77ece72faf37d619 (patch)
tree4b40567de724aed269d1b1cd8cd32ad57dc4cfb4
parent1b828e50fe6cf67292a3ef4d777ec4cb9b7197f2 (diff)
parent9a57b24e17d67b91e4e71d3848331852ce293982 (diff)
Merge "app_queue: Fix locking behavior in stasis message handlers" into 13
-rw-r--r--apps/app_queue.c28
1 files changed, 16 insertions, 12 deletions
diff --git a/apps/app_queue.c b/apps/app_queue.c
index 65f1bf5d9..ddb62d2e0 100644
--- a/apps/app_queue.c
+++ b/apps/app_queue.c
@@ -5884,6 +5884,7 @@ static void handle_bridge_enter(void *userdata, struct stasis_subscription *sub,
{
struct queue_stasis_data *queue_data = userdata;
struct ast_bridge_blob *enter_blob = stasis_message_data(msg);
+ SCOPED_AO2LOCK(lock, queue_data);
if (queue_data->dying) {
return;
@@ -5947,7 +5948,7 @@ static void handle_bridge_left(void *userdata, struct stasis_subscription *sub,
ast_debug(3, "Detected redirect of queue caller channel %s\n",
caller_snapshot->name);
- ast_queue_log(queue_data->queue->name, queue_data->caller_uniqueid, queue_data->member->membername,
+ ast_queue_log(queue_data->queue->name, caller_snapshot->uniqueid, queue_data->member->membername,
"COMPLETECALLER", "%ld|%ld|%d",
(long) (queue_data->starttime - queue_data->holdstart),
(long) (time(NULL) - queue_data->starttime), queue_data->caller_pos);
@@ -5983,16 +5984,17 @@ static void handle_blind_transfer(void *userdata, struct stasis_subscription *su
RAII_VAR(struct ast_channel_snapshot *, caller_snapshot, NULL, ao2_cleanup);
RAII_VAR(struct ast_channel_snapshot *, member_snapshot, NULL, ao2_cleanup);
- if (queue_data->dying) {
- return;
- }
-
if (transfer_msg->result != AST_BRIDGE_TRANSFER_SUCCESS) {
return;
}
ao2_lock(queue_data);
+ if (queue_data->dying) {
+ ao2_unlock(queue_data);
+ return;
+ }
+
if (ast_strlen_zero(queue_data->bridge_uniqueid) ||
strcmp(queue_data->bridge_uniqueid, transfer_msg->bridge->uniqueid)) {
ao2_unlock(queue_data);
@@ -6040,10 +6042,6 @@ static void handle_attended_transfer(void *userdata, struct stasis_subscription
RAII_VAR(struct ast_channel_snapshot *, caller_snapshot, NULL, ao2_cleanup);
RAII_VAR(struct ast_channel_snapshot *, member_snapshot, NULL, ao2_cleanup);
- if (queue_data->dying) {
- return;
- }
-
if (atxfer_msg->result != AST_BRIDGE_TRANSFER_SUCCESS ||
atxfer_msg->dest_type == AST_ATTENDED_TRANSFER_DEST_THREEWAY) {
return;
@@ -6051,6 +6049,11 @@ static void handle_attended_transfer(void *userdata, struct stasis_subscription
ao2_lock(queue_data);
+ if (queue_data->dying) {
+ ao2_unlock(queue_data);
+ return;
+ }
+
if (ast_strlen_zero(queue_data->bridge_uniqueid)) {
ao2_unlock(queue_data);
return;
@@ -6234,12 +6237,13 @@ static void handle_hangup(void *userdata, struct stasis_subscription *sub,
RAII_VAR(struct ast_channel *, chan, NULL, ao2_cleanup);
enum agent_complete_reason reason;
+ ao2_lock(queue_data);
+
if (queue_data->dying) {
+ ao2_unlock(queue_data);
return;
}
- ao2_lock(queue_data);
-
if (!strcmp(channel_blob->snapshot->uniqueid, queue_data->caller_uniqueid)) {
reason = CALLER;
} else if (!strcmp(channel_blob->snapshot->uniqueid, queue_data->member_uniqueid)) {
@@ -6268,7 +6272,7 @@ static void handle_hangup(void *userdata, struct stasis_subscription *sub,
ast_debug(3, "Detected hangup of queue %s channel %s\n", reason == CALLER ? "caller" : "member",
channel_blob->snapshot->name);
- ast_queue_log(queue_data->queue->name, queue_data->caller_uniqueid, queue_data->member->membername,
+ ast_queue_log(queue_data->queue->name, caller_snapshot->uniqueid, queue_data->member->membername,
reason == CALLER ? "COMPLETECALLER" : "COMPLETEAGENT", "%ld|%ld|%d",
(long) (queue_data->starttime - queue_data->holdstart),
(long) (time(NULL) - queue_data->starttime), queue_data->caller_pos);