]> git.sesse.net Git - vlc/blobdiff - src/misc/threads.c
var_LocationParse: helper for DVB/V4L2-style MRLs
[vlc] / src / misc / threads.c
index 1999c9ec4c91725d82499c83ecd1f0786be4e1cd..265f60bd8bb922636cc36f47e6d34c710faf9d89 100644 (file)
@@ -33,6 +33,7 @@
 
 #include "libvlc.h"
 #include <assert.h>
+#include <errno.h>
 #ifdef HAVE_UNISTD_H
 # include <unistd.h>
 #endif
@@ -41,7 +42,6 @@
 # include <sched.h>
 #endif
 
-
 struct vlc_thread_boot
 {
     void * (*entry) (vlc_object_t *);
@@ -68,8 +68,7 @@ static void *thread_entry (void *data)
  * 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;
@@ -84,39 +83,25 @@ 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 )
-        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 );
 
@@ -128,7 +113,7 @@ int __vlc_thread_set_priority( vlc_object_t *p_this, const char * psz_file,
 
 #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;
@@ -136,7 +121,7 @@ int __vlc_thread_set_priority( vlc_object_t *p_this, const char * psz_file,
 
         memset( &param, 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;
@@ -151,16 +136,15 @@ int __vlc_thread_set_priority( vlc_object_t *p_this, const char * psz_file,
                                               i_policy, &param )) )
         {
             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;
@@ -171,70 +155,15 @@ int __vlc_thread_set_priority( vlc_object_t *p_this, const char * psz_file,
     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;
 }
 
@@ -245,3 +174,25 @@ void vlc_thread_cancel (vlc_object_t *obj)
     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;
+}