Commit 84098a5e authored by Damien Fouilleul's avatar Damien Fouilleul

threads.c: win32, changed the way thread handle is closed, which is now done...

threads.c: win32, changed the way thread handle is closed, which is now done on function exit, rather than thread_join
parent 6cdf1909
...@@ -552,6 +552,29 @@ int __vlc_threadvar_create( vlc_object_t *p_this, vlc_threadvar_t *p_tls ) ...@@ -552,6 +552,29 @@ int __vlc_threadvar_create( vlc_object_t *p_this, vlc_threadvar_t *p_tls )
return i_ret; return i_ret;
} }
#if defined( WIN32 ) || defined( UNDER_CE )
/*
** Use a wrapper function which will make sure that
** thread handle is closed
*/
struct _vlc_win32_init_thread_data {
void * ( *func ) (void * );
void *p_data;
};
static unsigned WINAPI __vlc_win32_thread_start(void* p_data) {
struct _vlc_win32_init_thread_data *p_win32data =
(struct _vlc_win32_init_thread_data *)p_data;
vlc_object_t *p_this = (vlc_object_t *)p_win32data->p_data;
HANDLE hThread = (HANDLE)p_this->p_internals->thread_id;
void *retval = (*p_win32data->func)((LPVOID)p_this);
CloseHandle(hThread);
return (unsigned)retval;
}
#endif
/***************************************************************************** /*****************************************************************************
* vlc_thread_create: create a thread, inner version * vlc_thread_create: create a thread, inner version
***************************************************************************** *****************************************************************************
...@@ -565,6 +588,9 @@ int __vlc_thread_create( vlc_object_t *p_this, const char * psz_file, int i_line ...@@ -565,6 +588,9 @@ int __vlc_thread_create( vlc_object_t *p_this, const char * psz_file, int i_line
int i_ret; int i_ret;
void *p_data = (void *)p_this; void *p_data = (void *)p_this;
vlc_object_internals_t *p_priv = p_this->p_internals; vlc_object_internals_t *p_priv = p_this->p_internals;
#if defined( WIN32 ) || defined( UNDER_CE )
struct _vlc_win32_init_thread_data win32data = { func, p_data };
#endif
vlc_mutex_lock( &p_this->object_lock ); vlc_mutex_lock( &p_this->object_lock );
...@@ -583,14 +609,14 @@ int __vlc_thread_create( vlc_object_t *p_this, const char * psz_file, int i_line ...@@ -583,14 +609,14 @@ int __vlc_thread_create( vlc_object_t *p_this, const char * psz_file, int i_line
* function instead of CreateThread, otherwise you'll end up with * function instead of CreateThread, otherwise you'll end up with
* memory leaks and the signal functions not working (see Microsoft * memory leaks and the signal functions not working (see Microsoft
* Knowledge Base, article 104641) */ * Knowledge Base, article 104641) */
p_priv->thread_id =
#if defined( UNDER_CE ) #if defined( UNDER_CE )
(HANDLE)CreateThread( NULL, 0, (PTHREAD_START) func, HANDLE hThread = CreateThread( NULL, 0, __vlc_win32_thread_start,
p_data, 0, &threadID ); (LPVOID)&win32data, 0, &threadID );
#else #else
(HANDLE)_beginthreadex( NULL, 0, (PTHREAD_START) func, uintptr_t hThread = _beginthreadex( NULL, 0, __vlc_win32_thread_start,
p_data, 0, &threadID ); (void*)&win32data, 0, &threadID );
#endif #endif
p_priv->thread_id = (HANDLE)hThread;
} }
if( p_priv->thread_id && i_priority ) if( p_priv->thread_id && i_priority )
...@@ -688,16 +714,18 @@ int __vlc_thread_create( vlc_object_t *p_this, const char * psz_file, int i_line ...@@ -688,16 +714,18 @@ int __vlc_thread_create( vlc_object_t *p_this, const char * psz_file, int i_line
int __vlc_thread_set_priority( vlc_object_t *p_this, const char * psz_file, int __vlc_thread_set_priority( vlc_object_t *p_this, const char * psz_file,
int i_line, int i_priority ) int i_line, int i_priority )
{ {
vlc_object_internals_t *p_priv = p_this->p_internals;
#if defined( PTH_INIT_IN_PTH_H ) || defined( ST_INIT_IN_ST_H ) #if defined( PTH_INIT_IN_PTH_H ) || defined( ST_INIT_IN_ST_H )
#elif defined( WIN32 ) || defined( UNDER_CE ) #elif defined( WIN32 ) || defined( UNDER_CE )
if( !SetThreadPriority(GetCurrentThread(), i_priority) ) if( !p_priv->thread_id )
p_priv->thread_id = GetCurrentThread();
if( !SetThreadPriority((HANDLE)p_priv->thread_id, i_priority) )
{ {
msg_Warn( p_this, "couldn't set a faster priority" ); msg_Warn( p_this, "couldn't set a faster priority" );
return 1; return 1;
} }
#elif defined( PTHREAD_COND_T_IN_PTHREAD_H ) #elif defined( PTHREAD_COND_T_IN_PTHREAD_H )
vlc_object_internals_t *p_priv = p_this->p_internals;
# ifndef __APPLE__ # ifndef __APPLE__
if( config_GetInt( p_this, "rt-priority" ) > 0 ) if( config_GetInt( p_this, "rt-priority" ) > 0 )
# endif # endif
...@@ -765,8 +793,25 @@ void __vlc_thread_join( vlc_object_t *p_this, const char * psz_file, int i_line ...@@ -765,8 +793,25 @@ void __vlc_thread_join( vlc_object_t *p_this, const char * psz_file, int i_line
FILETIME*, FILETIME* ); FILETIME*, FILETIME* );
FILETIME create_ft, exit_ft, kernel_ft, user_ft; FILETIME create_ft, exit_ft, kernel_ft, user_ft;
int64_t real_time, kernel_time, user_time; int64_t real_time, kernel_time, user_time;
HANDLE hThread;
/* thread will destroy its own handle on exit, duplicate it here */
if( ! DuplicateHandle(GetCurrentProcess(),
(HANDLE)p_priv->thread_id,
GetCurrentProcess(),
&hThread,
0,
FALSE,
DUPLICATE_SAME_ACCESS) )
{
msg_Err( p_this, "thread_join(%u) failed at %s:%d (%s)",
(unsigned int)p_priv->thread_id, psz_file, i_line,
GetLastError() );
p_priv->b_thread = VLC_FALSE;
return;
}
WaitForSingleObject( p_priv->thread_id, INFINITE ); WaitForSingleObject( hThread, INFINITE );
#if defined( UNDER_CE ) #if defined( UNDER_CE )
hmodule = GetModuleHandle( _T("COREDLL") ); hmodule = GetModuleHandle( _T("COREDLL") );
...@@ -778,7 +823,7 @@ void __vlc_thread_join( vlc_object_t *p_this, const char * psz_file, int i_line ...@@ -778,7 +823,7 @@ void __vlc_thread_join( vlc_object_t *p_this, const char * psz_file, int i_line
GetProcAddress( hmodule, _T("GetThreadTimes") ); GetProcAddress( hmodule, _T("GetThreadTimes") );
if( OurGetThreadTimes && if( OurGetThreadTimes &&
OurGetThreadTimes( p_priv->thread_id, OurGetThreadTimes( hThread,
&create_ft, &exit_ft, &kernel_ft, &user_ft ) ) &create_ft, &exit_ft, &kernel_ft, &user_ft ) )
{ {
real_time = real_time =
...@@ -803,7 +848,7 @@ void __vlc_thread_join( vlc_object_t *p_this, const char * psz_file, int i_line ...@@ -803,7 +848,7 @@ void __vlc_thread_join( vlc_object_t *p_this, const char * psz_file, int i_line
user_time/60/1000000, user_time/60/1000000,
(double)((user_time%(60*1000000))/1000000.0) ); (double)((user_time%(60*1000000))/1000000.0) );
} }
CloseHandle( p_priv->thread_id ); CloseHandle( hThread );
#elif defined( HAVE_KERNEL_SCHEDULER_H ) #elif defined( HAVE_KERNEL_SCHEDULER_H )
int32_t exit_value; int32_t exit_value;
......
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