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;
{
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;
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);
}
typedef enum {
BLADE_SESSION_STATE_NONE,
+ BLADE_SESSION_STATE_CLEANUP,
BLADE_SESSION_STATE_DESTROY,
BLADE_SESSION_STATE_HANGUP,
BLADE_SESSION_STATE_CONNECT,