[vlc-devel] commit: Do not use vlc_thread_create for the IPC helper ( Rémi Denis-Courmont )
git version control
git at videolan.org
Sat Aug 9 10:13:24 CEST 2008
vlc | branch: master | Rémi Denis-Courmont <rdenis at simphalempin.com> | Sat Aug 9 11:15:25 2008 +0300| [0ff2efe287474fe029c4a2a28d39aaf7d0c7e2d3] | committer: Rémi Denis-Courmont
Do not use vlc_thread_create for the IPC helper
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=0ff2efe287474fe029c4a2a28d39aaf7d0c7e2d3
---
src/libvlc.h | 4 ----
src/misc/win32_specific.c | 37 ++++++++++++++++++++++---------------
2 files changed, 22 insertions(+), 19 deletions(-)
diff --git a/src/libvlc.h b/src/libvlc.h
index 0c7c295..94e2a69 100644
--- a/src/libvlc.h
+++ b/src/libvlc.h
@@ -259,10 +259,6 @@ typedef struct libvlc_priv_t
unsigned threads_count;
vlc_mutex_t threads_lock;
vlc_cond_t threads_wait;
-
-#ifdef WIN32
- vlc_object_t *ipc_helper;
-#endif
} libvlc_priv_t;
static inline libvlc_priv_t *libvlc_priv (libvlc_int_t *libvlc)
diff --git a/src/misc/win32_specific.c b/src/misc/win32_specific.c
index c45075d..9e27ca9 100644
--- a/src/misc/win32_specific.c
+++ b/src/misc/win32_specific.c
@@ -120,8 +120,11 @@ void system_Init( libvlc_int_t *p_this, int *pi_argc, const char *ppsz_argv[] )
/*****************************************************************************
* system_Configure: check for system specific configuration options.
*****************************************************************************/
-static void* IPCHelperThread( vlc_object_t * );
+static unsigned __stdcall IPCHelperThread( void * );
LRESULT CALLBACK WMCOPYWNDPROC( HWND, UINT, WPARAM, LPARAM );
+static vlc_object_t *p_helper = NULL;
+static unsigned long hIPCHelper;
+
typedef struct
{
int argc;
@@ -149,8 +152,6 @@ 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" ) ) )
@@ -173,20 +174,25 @@ void system_Configure( libvlc_int_t *p_this, int *pi_argc, const char *ppsz_argv
{
/* We are the 1st instance. */
static const char typename[] = "ipc helper";
- vlc_object_t *p_helper =
+ p_helper =
vlc_custom_create( p_this, sizeof(vlc_object_t),
VLC_OBJECT_GENERIC, typename );
+ vlc_object_lock( p_helper );
/* Run the helper thread */
- if( vlc_thread_create( p_helper, "IPC helper", IPCHelperThread,
- VLC_THREAD_PRIORITY_LOW, true ) )
+ hIPCHelper = _beginthreadex( NULL, 0, IPCHelperThread, p_helper,
+ 0, NULL );
+ if( hIPCHelper )
+ vlc_object_wait( p_helper );
+ vlc_object_unlock( p_helper );
+
+ if( !hIPCHelper )
{
msg_Err( p_this, "one instance mode DISABLED "
"(IPC helper thread couldn't be created)" );
vlc_object_release (p_helper);
+ p_helper = NULL;
}
- else
- libvlc_priv (p_this)->ipc_helper = p_helper;
/* Initialization done.
* Release the mutex to unblock other instances */
@@ -262,8 +268,9 @@ void system_Configure( libvlc_int_t *p_this, int *pi_argc, const char *ppsz_argv
#endif
}
-static void* IPCHelperThread( vlc_object_t *p_this )
+static unsigned __stdcall IPCHelperThread( void *data )
{
+ vlc_object_t *p_this = data;
HWND ipcwindow;
MSG message;
@@ -284,14 +291,14 @@ static void* IPCHelperThread( vlc_object_t *p_this )
SetWindowLongPtr( ipcwindow, GWLP_USERDATA, (LONG_PTR)p_this );
/* Signal the creation of the thread and events queue */
- vlc_thread_ready( p_this );
+ vlc_object_signal( p_this );
while( GetMessage( &message, NULL, 0, 0 ) )
{
TranslateMessage( &message );
DispatchMessage( &message );
}
- return NULL;
+ return 0;
}
LRESULT CALLBACK WMCOPYWNDPROC( HWND hwnd, UINT uMsg, WPARAM wParam,
@@ -365,11 +372,11 @@ 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)
+ if (p_helper && p_helper->p_parent == VLC_OBJECT(p_this) )
{
- vlc_thread_join (obj);
- vlc_object_release (obj);
+ /* FIXME: thread-safety + join the thread(?)... */
+ vlc_object_release (p_helper);
+ p_helper = NULL;
}
#if !defined( UNDER_CE )
More information about the vlc-devel
mailing list