summaryrefslogtreecommitdiff
path: root/apps
diff options
context:
space:
mode:
authorRussell Bryant <russell@russellbryant.com>2007-03-08 23:21:44 +0000
committerRussell Bryant <russell@russellbryant.com>2007-03-08 23:21:44 +0000
commitb1678e3b5080c8d7bf9b0aa382e47eb34827dd04 (patch)
tree4aed74d4339e41457c62e6fc0720fb07b9293481 /apps
parentd04a9e0bc0e6fd5ac01d56d7ad1a4ddf83bb7aee (diff)
Merged revisions 58512 via svnmerge from
https://origsvn.digium.com/svn/asterisk/branches/1.4 ........ r58512 | russell | 2007-03-08 16:15:15 -0600 (Thu, 08 Mar 2007) | 5 lines Hang up the channel that put the call on hold in the event processing thread to avoid a race condition. Also, if the station originated the call that it is putting on hold, don't hang up the trunk if it was the only station on the call and it is hanging up due to hold and not a normal hangup. ........ git-svn-id: https://origsvn.digium.com/svn/asterisk/trunk@58541 65c4cc65-6c06-0410-ace0-fbb531ad65f3
Diffstat (limited to 'apps')
-rw-r--r--apps/app_meetme.c11
1 files changed, 5 insertions, 6 deletions
diff --git a/apps/app_meetme.c b/apps/app_meetme.c
index 313d7ab29..925fe7b80 100644
--- a/apps/app_meetme.c
+++ b/apps/app_meetme.c
@@ -1302,9 +1302,6 @@ static void sla_queue_event_conf(enum sla_event_type type, struct ast_channel *c
return;
}
- ast_softhangup(chan, AST_CAUSE_NORMAL);
- trunk_ref->chan = NULL;
-
sla_queue_event_full(type, trunk_ref, station, 1);
}
@@ -3674,6 +3671,9 @@ static void sla_handle_hold_event(struct sla_event *event)
event->station->name, event->trunk_ref->trunk->name);
sla_change_trunk_state(event->trunk_ref->trunk, SLA_TRUNK_STATE_ONHOLD,
INACTIVE_TRUNK_REFS, event->trunk_ref);
+
+ ast_softhangup(event->trunk_ref->chan, AST_CAUSE_NORMAL);
+ event->trunk_ref->chan = NULL;
}
/*! \brief Process trunk ring timeouts
@@ -4039,7 +4039,6 @@ static int sla_station_exec(struct ast_channel *chan, void *data)
struct sla_station *station;
struct sla_trunk_ref *trunk_ref = NULL;
char conf_name[MAX_CONFNUM];
- int res;
struct ast_flags conf_flags = { 0 };
struct ast_conference *conf;
@@ -4146,8 +4145,8 @@ static int sla_station_exec(struct ast_channel *chan, void *data)
conf = NULL;
}
trunk_ref->chan = NULL;
- res = ast_atomic_fetchadd_int((int *) &trunk_ref->trunk->active_stations, -1);
- if (res == 1) {
+ if (ast_atomic_dec_and_test((int *) &trunk_ref->trunk->active_stations) &&
+ !trunk_ref->trunk->hold_stations) {
strncat(conf_name, "|K", sizeof(conf_name) - strlen(conf_name) - 1);
admin_exec(NULL, conf_name);
sla_change_trunk_state(trunk_ref->trunk, SLA_TRUNK_STATE_IDLE, ALL_TRUNK_REFS, NULL);