]> git.sesse.net Git - vlc/blobdiff - src/misc/win32_specific.c
Do not leak the IPC helper - might fix #1598
[vlc] / src / misc / win32_specific.c
index 683337abb5346d9cb4d45039d29fddaef4519eb1..17af95b2cdb9c91bc29a197f7617c5e855158d23 100644 (file)
 # include "config.h"
 #endif
 
-#include <vlc/vlc.h>
+#define UNICODE
+#include <vlc_common.h>
 #include "../libvlc.h"
 #include <vlc_playlist.h>
 #include <vlc_charset.h>
 
-#ifdef WIN32                       /* optind, getopt(), included in unistd.h */
-#   include "../extras/getopt.h"
-#endif
+#include "../extras/getopt.h"
 
 #if !defined( UNDER_CE )
 #   include <io.h>
@@ -54,7 +53,6 @@ void system_Init( libvlc_int_t *p_this, int *pi_argc, const char *ppsz_argv[] )
     char psz_path[MAX_PATH];
     char *psz_vlc;
 
-#if defined( UNDER_CE )
     wchar_t psz_wpath[MAX_PATH];
     if( GetModuleFileName( NULL, psz_wpath, MAX_PATH ) )
     {
@@ -63,17 +61,6 @@ void system_Init( libvlc_int_t *p_this, int *pi_argc, const char *ppsz_argv[] )
     }
     else psz_path[0] = '\0';
 
-#else
-    if( ppsz_argv[0] )
-    {
-        GetFullPathName( ppsz_argv[0], MAX_PATH, psz_path, &psz_vlc );
-    }
-    else if( !GetModuleFileName( NULL, psz_path, MAX_PATH ) )
-    {
-        psz_path[0] = '\0';
-    }
-#endif
-
     if( (psz_vlc = strrchr( psz_path, '\\' )) ) *psz_vlc = '\0';
 
 #ifndef HAVE_RELEASE
@@ -162,6 +149,8 @@ void system_Configure( libvlc_int_t *p_this, int *pi_argc, const char *ppsz_argv
         }
     }
 
+    libvlc_priv (p_this)->ipc_helper = NULL;
+
     if( config_GetInt( p_this, "one-instance" )
         || ( config_GetInt( p_this, "one-instance-when-started-from-file" )
              && config_GetInt( p_this, "started-from-file" ) ) )
@@ -171,7 +160,7 @@ void system_Configure( libvlc_int_t *p_this, int *pi_argc, const char *ppsz_argv
         msg_Info( p_this, "one instance mode ENABLED");
 
         /* Use a named mutex to check if another instance is already running */
-        if( !( hmutex = CreateMutex( 0, TRUE, _T("VLC ipc ") _T(VERSION) ) ) )
+        if( !( hmutex = CreateMutex( 0, TRUE, L"VLC ipc "VERSION ) ) )
         {
             /* Failed for some reason. Just ignore the option and go on as
              * normal. */
@@ -183,8 +172,10 @@ void system_Configure( libvlc_int_t *p_this, int *pi_argc, const char *ppsz_argv
         if( GetLastError() != ERROR_ALREADY_EXISTS )
         {
             /* We are the 1st instance. */
+            static const char typename[] = "ipc helper";
             vlc_object_t *p_helper =
-             (vlc_object_t *)vlc_object_create( p_this, sizeof(vlc_object_t) );
+                vlc_custom_create( p_this, sizeof(vlc_object_t),
+                                   VLC_OBJECT_GENERIC, typename );
 
             /* Run the helper thread */
             if( vlc_thread_create( p_helper, "IPC helper", IPCHelperThread,
@@ -192,8 +183,10 @@ void system_Configure( libvlc_int_t *p_this, int *pi_argc, const char *ppsz_argv
             {
                 msg_Err( p_this, "one instance mode DISABLED "
                          "(IPC helper thread couldn't be created)" );
-
+                vlc_object_release (p_helper);
             }
+            else
+                libvlc_priv (p_this)->ipc_helper = p_helper;
 
             /* Initialization done.
              * Release the mutex to unblock other instances */
@@ -210,7 +203,7 @@ void system_Configure( libvlc_int_t *p_this, int *pi_argc, const char *ppsz_argv
 
             /* Locate the window created by the IPC helper thread of the
              * 1st instance */
-            if( !( ipcwindow = FindWindow( 0, _T("VLC ipc ") _T(VERSION) ) ) )
+            if( !( ipcwindow = FindWindow( 0, L"VLC ipc "VERSION ) ) )
             {
                 msg_Err( p_this, "one instance mode DISABLED "
                          "(couldn't find 1st instance of program)" );
@@ -275,8 +268,8 @@ static void IPCHelperThread( vlc_object_t *p_this )
     MSG message;
 
     ipcwindow =
-        CreateWindow( _T("STATIC"),                  /* name of window class */
-                  _T("VLC ipc ") _T(VERSION),       /* window title bar text */
+        CreateWindow( L"STATIC",                     /* name of window class */
+                  L"VLC ipc "VERSION,               /* window title bar text */
                   0,                                         /* window style */
                   0,                                 /* default X coordinate */
                   0,                                 /* default Y coordinate */
@@ -347,7 +340,7 @@ LRESULT CALLBACK WMCOPYWNDPROC( HWND hwnd, UINT uMsg, WPARAM wParam,
                         ( ( i_opt || p_data->enqueue ) ? 0 : PLAYLIST_GO ),
                   PLAYLIST_END, -1,
                   (char const **)( i_options ? &ppsz_argv[i_opt+1] : NULL ),
-                  i_options, true, false );
+                  i_options, true, pl_Unlocked );
 
                 i_opt += i_options;
             }
@@ -371,6 +364,12 @@ void system_End( libvlc_int_t *p_this )
         free( vlc_global()->psz_vlcpath );
         vlc_global()->psz_vlcpath = NULL;
     }
+    vlc_object_t *obj = libvlc_priv (p_this)->ipc_helper;
+    if (obj)
+    {
+        vlc_thread_join (obj);
+        vlc_object_release (obj);
+    }
 
 #if !defined( UNDER_CE )
     timeEndPeriod(5);