#include "libvlc.h"
#include <assert.h>
+#include <errno.h>
#ifdef HAVE_UNISTD_H
# include <unistd.h>
#endif
# include <sched.h>
#endif
-
struct vlc_thread_boot
{
void * (*entry) (vlc_object_t *);
* Note that i_priority is only taken into account on platforms supporting
* userland real-time priority threads.
*****************************************************************************/
-int vlc_thread_create( vlc_object_t *p_this, const char * psz_file, int i_line,
- const char *psz_name, void *(*func) ( vlc_object_t * ),
+int vlc_thread_create( vlc_object_t *p_this, void *(*func) ( vlc_object_t * ),
int i_priority )
{
int i_ret;
/* 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 )
-#ifndef __APPLE__
- if( config_GetInt( p_this, "rt-priority" ) > 0 )
-#endif
- {
- /* Hack to avoid error msg */
- if( config_GetType( p_this, "rt-offset" ) )
- i_priority += config_GetInt( p_this, "rt-offset" );
- }
-#endif
-
- p_priv->b_thread = true;
i_ret = vlc_clone( &p_priv->thread_id, thread_entry, boot, i_priority );
if( i_ret == 0 )
- msg_Dbg( p_this, "thread (%s) created at priority %d (%s:%d)",
- psz_name, i_priority, psz_file, i_line );
+ p_priv->b_thread = true;
else
{
- p_priv->b_thread = false;
errno = i_ret;
- msg_Err( p_this, "%s thread could not be created at %s:%d (%m)",
- psz_name, psz_file, i_line );
+ msg_Err( p_this, "cannot create thread (%m)" );
+ free (boot);
}
return i_ret;
}
+#undef vlc_thread_set_priority
/*****************************************************************************
* vlc_thread_set_priority: set the priority of the current thread when we
* couldn't set it in vlc_thread_create (for instance for the main thread)
*****************************************************************************/
-int __vlc_thread_set_priority( vlc_object_t *p_this, const char * psz_file,
- int i_line, int i_priority )
+int vlc_thread_set_priority( vlc_object_t *p_this, int i_priority )
{
vlc_object_internals_t *p_priv = vlc_internals( p_this );
#if defined( LIBVLC_USE_PTHREAD )
# ifndef __APPLE__
- if( config_GetInt( p_this, "rt-priority" ) > 0 )
+ if( var_InheritBool( p_this, "rt-priority" ) )
# endif
{
int i_error, i_policy;
memset( ¶m, 0, sizeof(struct sched_param) );
if( config_GetType( p_this, "rt-offset" ) )
- i_priority += config_GetInt( p_this, "rt-offset" );
+ i_priority += var_InheritInteger( p_this, "rt-offset" );
if( i_priority <= 0 )
{
param.sched_priority = (-1) * i_priority;
i_policy, ¶m )) )
{
errno = i_error;
- msg_Warn( p_this, "couldn't set thread priority (%s:%d): %m",
- psz_file, i_line );
+ msg_Warn( p_this, "cannot set thread priority (%m)" );
i_priority = 0;
}
}
#elif defined( WIN32 ) || defined( UNDER_CE )
- VLC_UNUSED( psz_file); VLC_UNUSED( i_line );
- if( !SetThreadPriority(p_priv->thread_id->handle, i_priority) )
+#warning vlc_thread_set_priority() is BROKEN
+ if( true /*!SetThreadPriority(p_priv->thread_id->id, i_priority)*/ )
{
msg_Warn( p_this, "couldn't set a faster priority" );
return 1;
return 0;
}
+#undef vlc_thread_join
/*****************************************************************************
* vlc_thread_join: wait until a thread exits, inner version
*****************************************************************************/
-void __vlc_thread_join( vlc_object_t *p_this )
+void vlc_thread_join( vlc_object_t *p_this )
{
vlc_object_internals_t *p_priv = vlc_internals( p_this );
-#if defined( LIBVLC_USE_PTHREAD )
- vlc_join (p_priv->thread_id, NULL);
-
-#elif defined( UNDER_CE ) || defined( WIN32 )
- HANDLE hThread;
- FILETIME create_ft, exit_ft, kernel_ft, user_ft;
- int64_t real_time, kernel_time, user_time;
-
-#ifndef UNDER_CE
- if( ! DuplicateHandle(GetCurrentProcess(),
- p_priv->thread_id->handle,
- GetCurrentProcess(),
- &hThread,
- 0,
- FALSE,
- DUPLICATE_SAME_ACCESS) )
- {
- p_priv->b_thread = false;
- return; /* We have a problem! */
- }
-#else
- hThread = p_priv->thread_id->handle;
-#endif
-
vlc_join( p_priv->thread_id, NULL );
-
- if( GetThreadTimes( hThread, &create_ft, &exit_ft, &kernel_ft, &user_ft ) )
- {
- real_time =
- ((((int64_t)exit_ft.dwHighDateTime)<<32)| exit_ft.dwLowDateTime) -
- ((((int64_t)create_ft.dwHighDateTime)<<32)| create_ft.dwLowDateTime);
- real_time /= 10;
-
- kernel_time =
- ((((int64_t)kernel_ft.dwHighDateTime)<<32)|
- kernel_ft.dwLowDateTime) / 10;
-
- user_time =
- ((((int64_t)user_ft.dwHighDateTime)<<32)|
- user_ft.dwLowDateTime) / 10;
-
- msg_Dbg( p_this, "thread times: "
- "real %"PRId64"m%fs, kernel %"PRId64"m%fs, user %"PRId64"m%fs",
- real_time/60/1000000,
- (double)((real_time%(60*1000000))/1000000.0),
- kernel_time/60/1000000,
- (double)((kernel_time%(60*1000000))/1000000.0),
- user_time/60/1000000,
- (double)((user_time%(60*1000000))/1000000.0) );
- }
- CloseHandle( hThread );
-
-#else
- vlc_join( p_priv->thread_id, NULL );
-
-#endif
-
p_priv->b_thread = false;
}
if (priv->b_thread)
vlc_cancel (priv->thread_id);
}
+
+/*** Global locks ***/
+
+void vlc_global_mutex (unsigned n, bool acquire)
+{
+ static vlc_mutex_t locks[] = {
+ VLC_STATIC_MUTEX,
+ VLC_STATIC_MUTEX,
+ VLC_STATIC_MUTEX,
+ };
+ assert (n < (sizeof (locks) / sizeof (locks[0])));
+ vlc_mutex_t *lock = locks + n;
+
+ if (acquire)
+ vlc_mutex_lock (lock);
+ else
+ vlc_mutex_unlock (lock);
+
+ /* Compile-time assertion ;-) */
+ char enough_locks[(sizeof (locks) / sizeof (locks[0])) - VLC_MAX_MUTEX];
+ (void) enough_locks;
+}