diff --git "a/session.c" "b/session.c" index 3c36271..60dc163 100644 --- "a/session.c" +++ "b/session.c" @@ -71,7 +71,7 @@ #define SOCKET_WAIT_TIMEOUT_MS (20) #define SESSION_IDLE_WAIT_TIME (100) - +volatile int ab_session_terminating = 0; static ab_session_p session_create_unsafe(const char *host, const char *path, plc_type_t plc_type, int *use_connected_msg, int connection_group_id); static int session_init(ab_session_p session); @@ -141,6 +141,8 @@ void session_teardown() { pdebug(DEBUG_INFO, "Starting."); + ab_session_terminating = 1; + if(sessions && session_mutex) { pdebug(DEBUG_DETAIL, "Waiting for sessions to terminate."); @@ -173,6 +175,8 @@ void session_teardown() session_mutex = NULL; } + ab_session_terminating = 0; + pdebug(DEBUG_INFO, "Done."); } @@ -1031,7 +1035,7 @@ THREAD_FUNC(session_handler) pdebug(DEBUG_INFO, "Starting thread for session %p", session); - while(!session->terminating) { + while(!session->terminating && !ab_session_terminating) { /* how long should we wait if nothing wakes us? */ wait_until_time = time_ms() + SESSION_IDLE_WAIT_TIME; @@ -1321,6 +1325,9 @@ THREAD_FUNC(session_handler) purge_aborted_requests_unsafe(session); } + if (ab_session_terminating) + session_destroy(session); + THREAD_RETURN(0); }