Commit f52524a2 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

vlc_clone(): abide by --rt-priority and --rt-offset

This avoids using real-time when not asked. It should also fix a
pthread_create() permission failure on FreeBSD (Linux seems to ignore
this error silently).
parent 5f81bec5
...@@ -733,6 +733,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, ...@@ -733,6 +733,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc,
var_SetInteger( p_libvlc, "verbose", -1 ); var_SetInteger( p_libvlc, "verbose", -1 );
priv->i_verbose = -1; priv->i_verbose = -1;
} }
vlc_threads_setup( p_libvlc );
if( priv->b_color ) if( priv->b_color )
priv->b_color = config_GetInt( p_libvlc, "color" ) > 0; priv->b_color = config_GetInt( p_libvlc, "color" ) > 0;
......
...@@ -62,6 +62,8 @@ vlc_list_t *vlc_list_find( vlc_object_t *, int, int ); ...@@ -62,6 +62,8 @@ vlc_list_t *vlc_list_find( vlc_object_t *, int, int );
void vlc_thread_cancel (vlc_object_t *); void vlc_thread_cancel (vlc_object_t *);
int vlc_object_waitpipe (vlc_object_t *obj); int vlc_object_waitpipe (vlc_object_t *obj);
void vlc_threads_setup (libvlc_int_t *);
void vlc_trace (const char *fn, const char *file, unsigned line); void vlc_trace (const char *fn, const char *file, unsigned line);
#define vlc_backtrace() vlc_trace(__func__, __FILE__, __LINE__) #define vlc_backtrace() vlc_trace(__func__, __FILE__, __LINE__)
......
...@@ -461,6 +461,31 @@ void *vlc_threadvar_get (vlc_threadvar_t key) ...@@ -461,6 +461,31 @@ void *vlc_threadvar_get (vlc_threadvar_t key)
return pthread_getspecific (key); return pthread_getspecific (key);
} }
static bool rt_priorities = false;
static int rt_offset;
void vlc_threads_setup (libvlc_int_t *p_libvlc)
{
static vlc_mutex_t lock = VLC_STATIC_MUTEX;
static bool initialized = false;
vlc_mutex_lock (&lock);
/* Initializes real-time priorities before any thread is created,
* just once per process. */
if (!initialized)
{
#ifndef __APPLE__
if (config_GetInt (p_libvlc, "rt-priority"))
#endif
{
rt_offset = config_GetInt (p_libvlc, "rt-offset");
rt_priorities = true;
}
initialized = true;
}
vlc_mutex_unlock (&lock);
}
/** /**
* Creates and starts new thread. * Creates and starts new thread.
* *
...@@ -504,8 +529,9 @@ int vlc_clone (vlc_thread_t *p_handle, void * (*entry) (void *), void *data, ...@@ -504,8 +529,9 @@ int vlc_clone (vlc_thread_t *p_handle, void * (*entry) (void *), void *data,
#if defined (_POSIX_PRIORITY_SCHEDULING) && (_POSIX_PRIORITY_SCHEDULING >= 0) \ #if defined (_POSIX_PRIORITY_SCHEDULING) && (_POSIX_PRIORITY_SCHEDULING >= 0) \
&& defined (_POSIX_THREAD_PRIORITY_SCHEDULING) \ && defined (_POSIX_THREAD_PRIORITY_SCHEDULING) \
&& (_POSIX_THREAD_PRIORITY_SCHEDULING >= 0) && (_POSIX_THREAD_PRIORITY_SCHEDULING >= 0)
if (rt_priorities)
{ {
struct sched_param sp = { .sched_priority = priority, }; struct sched_param sp = { .sched_priority = priority + rt_offset, };
int policy; int policy;
if (sp.sched_priority <= 0) if (sp.sched_priority <= 0)
......
...@@ -41,7 +41,6 @@ ...@@ -41,7 +41,6 @@
# include <sched.h> # include <sched.h>
#endif #endif
struct vlc_thread_boot struct vlc_thread_boot
{ {
void * (*entry) (vlc_object_t *); void * (*entry) (vlc_object_t *);
...@@ -84,17 +83,6 @@ int vlc_thread_create( vlc_object_t *p_this, const char * psz_file, int i_line, ...@@ -84,17 +83,6 @@ int vlc_thread_create( vlc_object_t *p_this, const char * psz_file, int i_line,
/* Make sure we don't re-create a thread if the object has already one */ /* Make sure we don't re-create a thread if the object has already one */
assert( !p_priv->b_thread ); 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; p_priv->b_thread = true;
i_ret = vlc_clone( &p_priv->thread_id, thread_entry, boot, i_priority ); i_ret = vlc_clone( &p_priv->thread_id, thread_entry, boot, i_priority );
if( i_ret == 0 ) if( i_ret == 0 )
......
...@@ -402,6 +402,11 @@ void *vlc_threadvar_get (vlc_threadvar_t key) ...@@ -402,6 +402,11 @@ void *vlc_threadvar_get (vlc_threadvar_t key)
/*** Threads ***/ /*** Threads ***/
void vlc_threads_setup (libvlc_int_t *p_libvlc)
{
(void) p_libvlc;
}
static unsigned __stdcall vlc_entry (void *data) static unsigned __stdcall vlc_entry (void *data)
{ {
vlc_cancel_t cancel_data = VLC_CANCEL_INIT; vlc_cancel_t cancel_data = VLC_CANCEL_INIT;
......
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