]> git.ipfire.org Git - thirdparty/asterisk.git/commitdiff
Hang up the channel that put the call on hold in the event processing thread to
authorRussell Bryant <russell@russellbryant.com>
Thu, 8 Mar 2007 22:15:15 +0000 (22:15 +0000)
committerRussell Bryant <russell@russellbryant.com>
Thu, 8 Mar 2007 22:15:15 +0000 (22:15 +0000)
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/branches/1.4@58512 65c4cc65-6c06-0410-ace0-fbb531ad65f3

apps/app_meetme.c

index 1fe4864df80a150085e672dcba2a403935f7701e..0d4d193d93f1f1846a95113fdefd23f84328995f 100644 (file)
@@ -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);