]> git.sesse.net Git - vlc/blobdiff - src/misc/threads.c
Win32 condition variable: remove write-only counter
[vlc] / src / misc / threads.c
index ed6dbc2ec9f8e98c0df62d6d4aaf488a70f9cc78..965338d1b9918039a2d7d2b16dcf0194d2608c61 100644 (file)
@@ -360,15 +360,12 @@ int __vlc_cond_init( vlc_cond_t *p_condvar )
     return ret;
 
 #elif defined( UNDER_CE ) || defined( WIN32 )
-    /* Initialize counter */
-    p_condvar->i_waiting_threads = 0;
-
     /* Create an auto-reset event. */
-    p_condvar->event = CreateEvent( NULL,   /* no security */
-                                    FALSE,  /* auto-reset event */
-                                    FALSE,  /* start non-signaled */
-                                    NULL ); /* unnamed */
-    return !p_condvar->event;
+    *p_condvar = CreateEvent( NULL,   /* no security */
+                              FALSE,  /* auto-reset event */
+                              FALSE,  /* start non-signaled */
+                              NULL ); /* unnamed */
+    return *p_condvar ? 0 : ENOMEM;
 
 #elif defined( HAVE_KERNEL_SCHEDULER_H )
     if( !p_condvar )
@@ -400,7 +397,7 @@ void __vlc_cond_destroy( const char * psz_file, int i_line, vlc_cond_t *p_condva
 #elif defined( UNDER_CE ) || defined( WIN32 )
     VLC_UNUSED( psz_file); VLC_UNUSED( i_line );
 
-    CloseHandle( p_condvar->event );
+    CloseHandle( *p_condvar );
 
 #elif defined( HAVE_KERNEL_SCHEDULER_H )
     p_condvar->init = 0;
@@ -442,7 +439,7 @@ void vlc_threadvar_delete (vlc_threadvar_t *p_tls)
 
 struct vlc_thread_boot
 {
-    void * (*entry) (void *);
+    void * (*entry) (vlc_object_t *);
     vlc_object_t *object;
 };
 
@@ -457,7 +454,7 @@ struct vlc_thread_boot
 static THREAD_RTYPE thread_entry (void *data)
 {
     vlc_object_t *obj = ((struct vlc_thread_boot *)data)->object;
-    void *(*func) (void *) = ((struct vlc_thread_boot *)data)->entry;
+    void *(*func) (vlc_object_t *) = ((struct vlc_thread_boot *)data)->entry;
 
     free (data);
 #ifndef NDEBUG
@@ -469,7 +466,11 @@ static THREAD_RTYPE thread_entry (void *data)
 
     libvlc_priv_t *libpriv = libvlc_priv (obj->p_libvlc);
     vlc_mutex_lock (&libpriv->threads_lock);
+#ifndef NDEBUG
+    libpriv->threads_count--;
+#else
     if (--libpriv->threads_count == 0)
+#endif
         vlc_cond_signal (&libpriv->threads_wait);
     vlc_mutex_unlock (&libpriv->threads_lock);
     return THREAD_RVAL;
@@ -482,7 +483,7 @@ static THREAD_RTYPE thread_entry (void *data)
  * 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 ) ( void * ),
+                         const char *psz_name, void * ( *func ) ( vlc_object_t * ),
                          int i_priority, bool b_wait )
 {
     int i_ret;
@@ -501,6 +502,9 @@ int __vlc_thread_create( vlc_object_t *p_this, const char * psz_file, int i_line
 
     vlc_object_lock( p_this );
 
+    /* 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 )
     pthread_attr_t attr;
     pthread_attr_init (&attr);
@@ -549,34 +553,30 @@ int __vlc_thread_create( vlc_object_t *p_this, const char * psz_file, int i_line
     pthread_attr_destroy (&attr);
 
 #elif defined( WIN32 ) || defined( UNDER_CE )
-    {
-        /* When using the MSVCRT C library you have to use the _beginthreadex
-         * function instead of CreateThread, otherwise you'll end up with
-         * memory leaks and the signal functions not working (see Microsoft
-         * Knowledge Base, article 104641) */
+    /* When using the MSVCRT C library you have to use the _beginthreadex
+     * function instead of CreateThread, otherwise you'll end up with
+     * memory leaks and the signal functions not working (see Microsoft
+     * Knowledge Base, article 104641) */
 #if defined( UNDER_CE )
-        HANDLE hThread = CreateThread( NULL, 0, thread_entry,
-                                       (LPVOID)boot, CREATE_SUSPENDED,
-                                        NULL );
+    HANDLE hThread = CreateThread( NULL, 0, thread_entry,
+                                  (LPVOID)boot, CREATE_SUSPENDED, NULL );
 #else
-        HANDLE hThread = (HANDLE)(uintptr_t)
-            _beginthreadex( NULL, 0, thread_entry, boot,
-                            CREATE_SUSPENDED, NULL );
+    HANDLE hThread = (HANDLE)(uintptr_t)
+        _beginthreadex( NULL, 0, thread_entry, boot, CREATE_SUSPENDED, NULL );
 #endif
-        p_priv->thread_id = hThread;
-        ResumeThread(hThread);
-    }
-
-    i_ret = ( p_priv->thread_id ? 0 : errno );
-
-    if( !i_ret && i_priority )
+    if( hThread )
     {
-        if( !SetThreadPriority(p_priv->thread_id, i_priority) )
+        p_priv->thread_id = hThread;
+        ResumeThread (hThread);
+        i_ret = 0;
+        if( i_priority && !SetThreadPriority (hThread, i_priority) )
         {
             msg_Warn( p_this, "couldn't set a faster priority" );
             i_priority = 0;
         }
     }
+    else
+        i_ret = errno;
 
 #elif defined( HAVE_KERNEL_SCHEDULER_H )
     p_priv->thread_id = spawn_thread( (thread_func)thread_entry, psz_name,
@@ -626,6 +626,12 @@ int __vlc_thread_set_priority( vlc_object_t *p_this, const char * psz_file,
 {
     vlc_object_internals_t *p_priv = vlc_internals( p_this );
 
+    if( !p_priv->b_thread )
+    {
+        msg_Err( p_this, "couldn't set priority of non-existent thread" );
+        return ESRCH;
+    }
+
 #if defined( LIBVLC_USE_PTHREAD )
 # ifndef __APPLE__
     if( config_GetInt( p_this, "rt-priority" ) > 0 )
@@ -647,10 +653,8 @@ int __vlc_thread_set_priority( vlc_object_t *p_this, const char * psz_file,
             param.sched_priority = i_priority;
             i_policy = SCHED_RR;
         }
-        if( !p_priv->thread_id )
-            p_priv->thread_id = pthread_self();
         if( (i_error = pthread_setschedparam( p_priv->thread_id,
-                                               i_policy, &param )) )
+                                              i_policy, &param )) )
         {
             errno = i_error;
             msg_Warn( p_this, "couldn't set thread priority (%s:%d): %m",
@@ -662,8 +666,6 @@ int __vlc_thread_set_priority( vlc_object_t *p_this, const char * psz_file,
 #elif defined( WIN32 ) || defined( UNDER_CE )
     VLC_UNUSED( psz_file); VLC_UNUSED( i_line );
 
-    if( !p_priv->thread_id )
-        p_priv->thread_id = GetCurrentThread();
     if( !SetThreadPriority(p_priv->thread_id, i_priority) )
     {
         msg_Warn( p_this, "couldn't set a faster priority" );