]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
fix auto unpark
authorAnthony Minessale <anthm@freeswitch.org>
Wed, 19 Oct 2011 19:19:36 +0000 (14:19 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Wed, 19 Oct 2011 19:19:36 +0000 (14:19 -0500)
src/mod/applications/mod_valet_parking/mod_valet_parking.c

index ba4d8605e18fb0b1df8d8fcb7b16bba0a8458ef7..f158c6c240949a2eeb648dc5eec3fb4441c794ae 100644 (file)
@@ -164,7 +164,11 @@ static valet_token_t *next_id(switch_core_session_t *session, valet_lot_t *lot,
                switch_snprintf(buf, sizeof(buf), "%d", i);
                token = (valet_token_t *) switch_core_hash_find(lot->hash, buf);
                
-               if ((in && !token) || (!in && token && !token->timeout)) {
+               if ((!in && token && !token->timeout)) {
+                       goto end;
+               }
+
+               if (in && !token) {
                        r = i;
                        break;
                }
@@ -180,6 +184,8 @@ static valet_token_t *next_id(switch_core_session_t *session, valet_lot_t *lot,
                switch_core_hash_insert(lot->hash, buf, token);
        }
 
+ end:
+
        switch_mutex_unlock(globals.mutex);
 
        return token;
@@ -340,6 +346,7 @@ SWITCH_STANDARD_APP(valet_parking_function)
                switch_input_args_t args = { 0 };
                char dbuf[10];
                char *dest;
+               int in = -1;
 
                lot = valet_find_lot(lot_name);
                switch_assert(lot);
@@ -348,7 +355,7 @@ SWITCH_STANDARD_APP(valet_parking_function)
                        const char *io = argv[2];
                        const char *min = argv[3];
                        const char *max = argv[4];
-                       int min_i, max_i, in = -1;
+                       int min_i, max_i;
 
                        if (argc < 5) {
                                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Usage: %s\n", VALET_APP_SYNTAX);
@@ -366,7 +373,6 @@ SWITCH_STANDARD_APP(valet_parking_function)
 
                        if (in < 0) {
                                switch_log_printf(SWITCH_CHANNEL_LOG, SWITCH_LOG_ERROR, "Usage: %s\n", VALET_APP_SYNTAX);
-                               switch_mutex_unlock(lot->mutex);
                                return;
                        }
 
@@ -375,12 +381,12 @@ SWITCH_STANDARD_APP(valet_parking_function)
 
                        if (!(token = next_id(session, lot, min_i, max_i, in))) {
                                switch_ivr_phrase_macro(session, in ? "valet_lot_full" : "valet_lot_empty", "", NULL, NULL);
-                               switch_mutex_unlock(lot->mutex);
                                return;
                        }
 
                        switch_snprintf(dtmf_buf, sizeof(dtmf_buf), "%s", token->ext);
                        ext = dtmf_buf;
+
                } else if (!strcasecmp(ext, "ask")) {
                        const char *prompt = "ivr/ivr-enter_ext_pound.wav";
                        int min = 1;
@@ -425,11 +431,15 @@ SWITCH_STANDARD_APP(valet_parking_function)
                        }
                }
 
-               if (!token) {
+               if (!token || !in) {
 
-                       
-                       switch_mutex_lock(lot->mutex);
-                       if ((token = (valet_token_t *) switch_core_hash_find(lot->hash, ext))) {
+                       if (!token) {
+                               switch_mutex_lock(lot->mutex);
+                               token = (valet_token_t *) switch_core_hash_find(lot->hash, ext);
+                               switch_mutex_unlock(lot->mutex);
+                       }
+
+                       if (token) {
                                switch_core_session_t *b_session;
                        
                                if (token->timeout) {
@@ -461,7 +471,6 @@ SWITCH_STANDARD_APP(valet_parking_function)
                                                token->bridged = 1;
 
                                                switch_ivr_uuid_bridge(switch_core_session_get_uuid(session), token->uuid);
-                                               switch_mutex_unlock(lot->mutex);
                                                return;
                                        }
                                }
@@ -505,7 +514,6 @@ SWITCH_STANDARD_APP(valet_parking_function)
                                                switch_ivr_phrase_macro(session, "valet_announce_ext", tmp, NULL, NULL);
                                        }
                                        switch_ivr_session_transfer(b_session, dest, "inline", NULL);
-                                       switch_mutex_unlock(lot->mutex);
                                        switch_core_session_rwunlock(b_session);
                                        switch_channel_hangup(channel, SWITCH_CAUSE_NORMAL_CLEARING);
                                        goto end;
@@ -534,7 +542,6 @@ SWITCH_STANDARD_APP(valet_parking_function)
                args.buf = dbuf;
                args.buflen = sizeof(dbuf);
 
-               switch_mutex_unlock(lot->mutex);
 
                
                while(switch_channel_ready(channel)) {