Commit 1441dee2 authored by Erwan Tulou's avatar Erwan Tulou

Win32: correct the 'one-instance' deallocation code

'one-instance' happens to work on Win32 though there are several issues:
- a WM_QUIT is sent to the helper thread when any instance terminates
 (the master or a secondary instance). 'one-instance' should then stop
 working as soon as the first secondary instance terminates.
- But, sending WM_QUIT via SendMessage directly calls the window
procedure callback. And this callback here doesn't process the message
at all. Therefore, it is a no-op and the thread is actually never stopped.

This patch does the following :
- move the WM_QUIT message to ensure that only the master (first) instance
 stops the helper thread.
- process the WM_QUIT message in the window procedure callback, and call
for clean termination of the thread.

Note that PostQuitMessage cannot be directly called as there are two
distincts threads here.
parent 66852fb3
...@@ -310,7 +310,11 @@ static unsigned __stdcall IPCHelperThread( void *data ) ...@@ -310,7 +310,11 @@ static unsigned __stdcall IPCHelperThread( void *data )
LRESULT CALLBACK WMCOPYWNDPROC( HWND hwnd, UINT uMsg, WPARAM wParam, LRESULT CALLBACK WMCOPYWNDPROC( HWND hwnd, UINT uMsg, WPARAM wParam,
LPARAM lParam ) LPARAM lParam )
{ {
if( uMsg == WM_COPYDATA ) if( uMsg == WM_QUIT )
{
PostQuitMessage( 0 );
}
else if( uMsg == WM_COPYDATA )
{ {
COPYDATASTRUCT *pwm_data = (COPYDATASTRUCT*)lParam; COPYDATASTRUCT *pwm_data = (COPYDATASTRUCT*)lParam;
vlc_object_t *p_this; vlc_object_t *p_this;
...@@ -382,13 +386,16 @@ void system_End( libvlc_int_t *p_this ) ...@@ -382,13 +386,16 @@ void system_End( libvlc_int_t *p_this )
psz_vlcpath = NULL; psz_vlcpath = NULL;
} }
if (p_helper && p_helper->p_parent == VLC_OBJECT(p_this) )
{
/* this is the first instance (in a one-instance system)
* it is the owner of the helper thread
*/
if( ( ipcwindow = FindWindow( 0, L"VLC ipc "VERSION ) ) != 0 ) if( ( ipcwindow = FindWindow( 0, L"VLC ipc "VERSION ) ) != 0 )
{ {
SendMessage( ipcwindow, WM_QUIT, 0, 0 ); SendMessage( ipcwindow, WM_QUIT, 0, 0 );
} }
if (p_helper && p_helper->p_parent == VLC_OBJECT(p_this) )
{
/* FIXME: thread-safety... */ /* FIXME: thread-safety... */
vlc_object_detach (p_helper); vlc_object_detach (p_helper);
vlc_object_release (p_helper); vlc_object_release (p_helper);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment