diff --git a/apps/app_meetme.c b/apps/app_meetme.c index 1fe4864df8..0d4d193d93 100644 --- a/apps/app_meetme.c +++ b/apps/app_meetme.c @@ -1304,9 +1304,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); } @@ -3664,6 +3661,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 @@ -4029,7 +4029,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; @@ -4136,8 +4135,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);