[vlc-devel] commit: vlc_clone(): abide by --rt-priority and --rt-offset ( Rémi Denis-Courmont )
git version control
git at videolan.org
Sat Jul 25 15:22:52 CEST 2009
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sat Jul 25 16:21:18 2009 +0300| [f52524a211617ca4db4fa290b7a867836e59fb78] | committer: 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).
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=f52524a211617ca4db4fa290b7a867836e59fb78
---
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 f0971a9..415d9d9 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 edd832b..15a8d21 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 14a48ad..644bf50 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 1999c9e..0f9821f 100644
--- a/src/misc/threads.c
+++ b/src/misc/threads.c
@@ -41,7 +41,6 @@
# include <sched.h>
#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 96c0a88..a2ef9ec 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;
More information about the vlc-devel
mailing list