From f52524a211617ca4db4fa290b7a867836e59fb78 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Sat, 25 Jul 2009 16:21:18 +0300 Subject: [PATCH] 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). --- src/libvlc.c | 1 + src/libvlc.h | 2 ++ src/misc/pthread.c | 28 +++++++++++++++++++++++++++- src/misc/threads.c | 12 ------------ src/misc/w32thread.c | 5 +++++ 5 files changed, 35 insertions(+), 13 deletions(-) diff --git a/src/libvlc.c b/src/libvlc.c index f0971a934c..415d9d9f71 100644 --- a/src/libvlc.c +++ b/src/libvlc.c @@ -733,6 +733,7 @@ int libvlc_InternalInit( libvlc_int_t *p_libvlc, int i_argc, var_SetInteger( p_libvlc, "verbose", -1 ); priv->i_verbose = -1; } + vlc_threads_setup( p_libvlc ); if( priv->b_color ) priv->b_color = config_GetInt( p_libvlc, "color" ) > 0; diff --git a/src/libvlc.h b/src/libvlc.h index edd832ba31..15a8d2150f 100644 --- a/src/libvlc.h +++ b/src/libvlc.h @@ -62,6 +62,8 @@ vlc_list_t *vlc_list_find( vlc_object_t *, int, int ); void vlc_thread_cancel (vlc_object_t *); 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); #define vlc_backtrace() vlc_trace(__func__, __FILE__, __LINE__) diff --git a/src/misc/pthread.c b/src/misc/pthread.c index 14a48ad21b..644bf50f93 100644 --- a/src/misc/pthread.c +++ b/src/misc/pthread.c @@ -461,6 +461,31 @@ void *vlc_threadvar_get (vlc_threadvar_t 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. * @@ -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) \ && defined (_POSIX_THREAD_PRIORITY_SCHEDULING) \ && (_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; if (sp.sched_priority <= 0) diff --git a/src/misc/threads.c b/src/misc/threads.c index 1999c9ec4c..0f9821fb8d 100644 --- a/src/misc/threads.c +++ b/src/misc/threads.c @@ -41,7 +41,6 @@ # include #endif - struct vlc_thread_boot { 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, /* 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 ) diff --git a/src/misc/w32thread.c b/src/misc/w32thread.c index 96c0a88007..a2ef9eca27 100644 --- a/src/misc/w32thread.c +++ b/src/misc/w32thread.c @@ -402,6 +402,11 @@ void *vlc_threadvar_get (vlc_threadvar_t key) /*** Threads ***/ +void vlc_threads_setup (libvlc_int_t *p_libvlc) +{ + (void) p_libvlc; +} + static unsigned __stdcall vlc_entry (void *data) { vlc_cancel_t cancel_data = VLC_CANCEL_INIT; -- 2.39.5