vlc_object_lock( p_this );
+ /* Make sure we don't re-create a thread if the object has already one */
+ assert( !p_priv->b_thread );
+
#if defined( LIBVLC_USE_PTHREAD )
pthread_attr_t attr;
pthread_attr_init (&attr);
pthread_attr_destroy (&attr);
#elif defined( WIN32 ) || defined( UNDER_CE )
- {
- /* When using the MSVCRT C library you have to use the _beginthreadex
- * function instead of CreateThread, otherwise you'll end up with
- * memory leaks and the signal functions not working (see Microsoft
- * Knowledge Base, article 104641) */
+ /* When using the MSVCRT C library you have to use the _beginthreadex
+ * function instead of CreateThread, otherwise you'll end up with
+ * memory leaks and the signal functions not working (see Microsoft
+ * Knowledge Base, article 104641) */
#if defined( UNDER_CE )
- HANDLE hThread = CreateThread( NULL, 0, thread_entry,
- (LPVOID)boot, CREATE_SUSPENDED,
- NULL );
+ HANDLE hThread = CreateThread( NULL, 0, thread_entry,
+ (LPVOID)boot, CREATE_SUSPENDED, NULL );
#else
- HANDLE hThread = (HANDLE)(uintptr_t)
- _beginthreadex( NULL, 0, thread_entry, boot,
- CREATE_SUSPENDED, NULL );
+ HANDLE hThread = (HANDLE)(uintptr_t)
+ _beginthreadex( NULL, 0, thread_entry, boot, CREATE_SUSPENDED, NULL );
#endif
- p_priv->thread_id = hThread;
- ResumeThread(hThread);
- }
-
- i_ret = ( p_priv->thread_id ? 0 : errno );
-
- if( !i_ret && i_priority )
+ if( hThread )
{
- if( !SetThreadPriority(p_priv->thread_id, i_priority) )
+ p_priv->thread_id = hThread;
+ ResumeThread (hThread);
+ i_ret = 0;
+ if( i_priority && !SetThreadPriority (hThread, i_priority) )
{
msg_Warn( p_this, "couldn't set a faster priority" );
i_priority = 0;
}
}
+ else
+ i_ret = errno;
#elif defined( HAVE_KERNEL_SCHEDULER_H )
p_priv->thread_id = spawn_thread( (thread_func)thread_entry, psz_name,
{
vlc_object_internals_t *p_priv = vlc_internals( p_this );
+ if( !p_priv->b_thread )
+ {
+ msg_Err( p_this, "couldn't set priority of non-existent thread" );
+ return ESRCH;
+ }
+
#if defined( LIBVLC_USE_PTHREAD )
# ifndef __APPLE__
if( config_GetInt( p_this, "rt-priority" ) > 0 )
param.sched_priority = i_priority;
i_policy = SCHED_RR;
}
- if( !p_priv->thread_id )
- p_priv->thread_id = pthread_self();
if( (i_error = pthread_setschedparam( p_priv->thread_id,
- i_policy, ¶m )) )
+ i_policy, ¶m )) )
{
errno = i_error;
msg_Warn( p_this, "couldn't set thread priority (%s:%d): %m",
#elif defined( WIN32 ) || defined( UNDER_CE )
VLC_UNUSED( psz_file); VLC_UNUSED( i_line );
- if( !p_priv->thread_id )
- p_priv->thread_id = GetCurrentThread();
if( !SetThreadPriority(p_priv->thread_id, i_priority) )
{
msg_Warn( p_this, "couldn't set a faster priority" );
return 0;
}
-/*****************************************************************************
- * vlc_thread_ready: tell the parent thread we were successfully spawned
- *****************************************************************************/
-void __vlc_thread_ready( vlc_object_t *p_this )
-{
- vlc_object_signal( p_this );
-}
-
/*****************************************************************************
* vlc_thread_join: wait until a thread exits, inner version
*****************************************************************************/