]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
better version of yesterday's patch
authorAnthony Minessale <anthm@freeswitch.org>
Sat, 29 Oct 2011 14:53:09 +0000 (09:53 -0500)
committerAnthony Minessale <anthm@freeswitch.org>
Sat, 29 Oct 2011 14:53:09 +0000 (09:53 -0500)
src/mod/applications/mod_valet_parking/mod_valet_parking.c

index 7c26878dec28364ef6955f2cbbad5005ba8b8f9b..4b7fa05e503b7efec9d387d2f5a37fdaa3eda090 100644 (file)
@@ -166,8 +166,10 @@ static valet_token_t *next_id(switch_core_session_t *session, valet_lot_t *lot,
        switch_mutex_lock(globals.mutex);
        for (i = min; (i < max || max == 0); i++) {
                switch_snprintf(buf, sizeof(buf), "%d", i);
+               switch_mutex_lock(lot->mutex);
                token = (valet_token_t *) switch_core_hash_find(lot->hash, buf);
-               
+               switch_mutex_unlock(lot->mutex);
+
                if ((!in && token && !token->timeout)) {
                        goto end;
                }
@@ -185,7 +187,9 @@ static valet_token_t *next_id(switch_core_session_t *session, valet_lot_t *lot,
                switch_zmalloc(token, sizeof(*token));
                switch_set_string(token->uuid, switch_core_session_get_uuid(session));
                switch_set_string(token->ext, buf);
+               switch_mutex_lock(lot->mutex);
                switch_core_hash_insert(lot->hash, buf, token);
+               switch_mutex_unlock(lot->mutex);
        }
 
  end:
@@ -450,13 +454,10 @@ SWITCH_STANDARD_APP(valet_parking_function)
                        if (!token) {
                                switch_mutex_lock(lot->mutex);
                                token = (valet_token_t *) switch_core_hash_find(lot->hash, ext);
-                               if (token->bridged) {
-                                       token = NULL;
-                               }
                                switch_mutex_unlock(lot->mutex);
                        }
 
-                       if (token) {
+                       if (token && !token->bridged) {
                                switch_core_session_t *b_session;
                        
                                if (token->timeout) {
@@ -494,12 +495,19 @@ SWITCH_STANDARD_APP(valet_parking_function)
                                }
                        }
 
-                       token = NULL;
-
-                       switch_zmalloc(token, sizeof(*token));
+                       if (token) {
+                               switch_mutex_lock(lot->mutex);
+                               switch_core_hash_delete(lot->hash, token->ext);
+                               switch_mutex_unlock(lot->mutex);
+                               memset(token, 0, sizeof(*token));
+                       } else {
+                               switch_zmalloc(token, sizeof(*token));
+                       }
                        switch_set_string(token->uuid, switch_core_session_get_uuid(session));
                        switch_set_string(token->ext, ext);
+                       switch_mutex_lock(lot->mutex);
                        switch_core_hash_insert(lot->hash, ext, token);
+                       switch_mutex_unlock(lot->mutex);
                }
 
                if (!(tmp = switch_channel_get_variable(channel, "valet_hold_music"))) {
@@ -619,6 +627,7 @@ SWITCH_STANDARD_API(valet_info_function)
 
                stream->write_function(stream, "  <lot name=\"%s\">\n", name);
 
+               switch_mutex_lock(lot->mutex);
                for (i_hi = switch_hash_first(NULL, lot->hash); i_hi; i_hi = switch_hash_next(i_hi)) {
                        valet_token_t *token;
 
@@ -630,6 +639,8 @@ SWITCH_STANDARD_API(valet_info_function)
                                stream->write_function(stream, "    <extension uuid=\"%s\">%s</extension>\n", token->uuid, i_ext);
                        }
                }
+               switch_mutex_unlock(lot->mutex);
+
                stream->write_function(stream, "  </lot>\n");
        }