The thread launched to detect desktop switches events is not stopped correctly causing potentially dandling pointers. Queue a APC to make the loop exit and wait for thread termination from the main thread. Signed-off-by: Frediano Ziglio <fziglio@xxxxxxxxxx> --- vdagent/vdagent.cpp | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/vdagent/vdagent.cpp b/vdagent/vdagent.cpp index e0923be..0321d85 100644 --- a/vdagent/vdagent.cpp +++ b/vdagent/vdagent.cpp @@ -240,11 +240,13 @@ DWORD WINAPI VDAgent::event_thread_proc(LPVOID param) return 1; } while (agent->_running) { - DWORD wait_ret = WaitForSingleObject(desktop_event, INFINITE); + DWORD wait_ret = WaitForSingleObjectEx(desktop_event, INFINITE, TRUE); switch (wait_ret) { case WAIT_OBJECT_0: agent->set_control_event(CONTROL_DESKTOP_SWITCH); break; + case WAIT_IO_COMPLETION: + break; case WAIT_TIMEOUT: default: vd_printf("WaitForSingleObject(): %lu", wait_ret); @@ -254,6 +256,10 @@ DWORD WINAPI VDAgent::event_thread_proc(LPVOID param) return 0; } +static VOID CALLBACK event_thread_stop_proc(ULONG_PTR) +{ +} + bool VDAgent::run() { DWORD session_id; @@ -335,8 +341,12 @@ bool VDAgent::run() set_clipboard_owner(owner_none); } } - vd_printf("Agent stopped"); + if (!QueueUserAPC(event_thread_stop_proc, event_thread, 0)) { + TerminateThread(event_thread, 0); + } + WaitForSingleObject(event_thread, INFINITE); CloseHandle(event_thread); + vd_printf("Agent stopped"); return true; } -- 2.17.1 _______________________________________________ Spice-devel mailing list Spice-devel@xxxxxxxxxxxxxxxxxxxxx https://lists.freedesktop.org/mailman/listinfo/spice-devel