]> git.ipfire.org Git - thirdparty/freeswitch.git/commitdiff
FS-10167: Fixed sessions to cleanup external from their own state processing thread...
authorShane Bryldt <astaelan@gmail.com>
Tue, 4 Apr 2017 18:47:14 +0000 (12:47 -0600)
committerShane Bryldt <astaelan@gmail.com>
Tue, 4 Apr 2017 18:47:14 +0000 (12:47 -0600)
libs/libblade/src/blade_session.c
libs/libblade/src/blade_stack.c
libs/libblade/src/include/blade_types.h

index f284d9004565a63dc268998b4229c6ecb7342a78..3d0c61c17dbfd92808144a767d8d5c8f9f19292a 100644 (file)
@@ -505,8 +505,7 @@ ks_status_t blade_session_state_on_destroy(blade_session_t *bs)
 
        ks_log(KS_LOG_DEBUG, "Session (%s) state destroy\n", bs->id);
 
-       blade_handle_sessions_remove(bs);
-       blade_session_destroy(&bs);
+       blade_session_state_set(bs, BLADE_SESSION_STATE_CLEANUP);
 
        // @todo ignoring returns for now, see what makes sense later
        return KS_STATUS_SUCCESS;
index 9af67c4a22e5a4e137cfce50f32af94a2ea7a130..5a8a81b80002ea5999011a15be71b3c6e289d123 100644 (file)
@@ -889,6 +889,7 @@ void *blade_handle_worker_thread(ks_thread_t *thread, void *data)
 {
        blade_handle_t *bh = NULL;
        blade_connection_t *bc = NULL;
+       blade_session_t *bs = NULL;
        ks_hash_iterator_t *it = NULL;
        ks_q_t *cleanup = NULL;
 
@@ -917,6 +918,22 @@ void *blade_handle_worker_thread(ks_thread_t *thread, void *data)
                        blade_connection_destroy(&bc);
                }
 
+               ks_hash_write_lock(bh->sessions);
+               for (it = ks_hash_first(bh->sessions, KS_UNLOCKED); it; it = ks_hash_next(&it)) {
+                       void *key = NULL;
+                       blade_session_t *value = NULL;
+
+                       ks_hash_this(it, (const void **)&key, NULL, (void **)&value);
+
+                       if (blade_session_state_get(value) == BLADE_SESSION_STATE_CLEANUP) ks_q_push(cleanup, value);
+               }
+               ks_hash_write_unlock(bh->sessions);
+
+               while (ks_q_trypop(cleanup, (void **)&bs) == KS_STATUS_SUCCESS) {
+                       blade_handle_sessions_remove(bs);
+                       blade_session_destroy(&bs);
+               }
+
                ks_sleep_ms(500);
        }
 
index 71326f0b3a562ea4409bd137659c3066efe102bb..6bd23134e5987388bbd2330bdfd1f11f62961a6b 100644 (file)
@@ -105,6 +105,7 @@ typedef enum {
 
 typedef enum {
        BLADE_SESSION_STATE_NONE,
+       BLADE_SESSION_STATE_CLEANUP,
        BLADE_SESSION_STATE_DESTROY,
        BLADE_SESSION_STATE_HANGUP,
        BLADE_SESSION_STATE_CONNECT,