]> git.sesse.net Git - vlc/blobdiff - include/vlc_threads.h
vlc_bits: constify
[vlc] / include / vlc_threads.h
index 5ba95265c4e3844e8651fa12c95937877dd88062..7d65e4f10dea5f0a370b9d24295d9c2418b49548 100644 (file)
@@ -107,18 +107,20 @@ typedef pthread_t       vlc_thread_t;
 typedef pthread_mutex_t vlc_mutex_t;
 #define VLC_STATIC_MUTEX PTHREAD_MUTEX_INITIALIZER
 typedef pthread_cond_t  vlc_cond_t;
+typedef pthread_rwlock_t vlc_rwlock_t;
 typedef pthread_key_t   vlc_threadvar_t;
+typedef struct vlc_timer *vlc_timer_t;
 
 #elif defined( WIN32 )
+#if !defined( UNDER_CE )
+typedef HANDLE vlc_thread_t;
+#else
 typedef struct
 {
     HANDLE handle;
-    void  *(*entry) (void *);
-    void  *data;
-#if defined( UNDER_CE )
     HANDLE cancel_event;
-#endif
 } *vlc_thread_t;
+#endif
 
 typedef struct
 {
@@ -128,8 +130,19 @@ typedef struct
 #define VLC_STATIC_MUTEX { 0, }
 
 typedef HANDLE  vlc_cond_t;
-typedef DWORD   vlc_threadvar_t;
 
+typedef struct
+{
+    vlc_mutex_t   mutex;
+    vlc_cond_t    read_wait;
+    vlc_cond_t    write_wait;
+    unsigned long readers;
+    unsigned long writers;
+    DWORD         writer;
+} vlc_rwlock_t;
+
+typedef DWORD   vlc_threadvar_t;
+typedef struct vlc_timer *vlc_timer_t;
 #endif
 
 #if defined( WIN32 ) && !defined ETIMEDOUT
@@ -139,18 +152,23 @@ typedef DWORD   vlc_threadvar_t;
 /*****************************************************************************
  * Function definitions
  *****************************************************************************/
-VLC_EXPORT( int,  vlc_mutex_init,    ( vlc_mutex_t * ) );
-VLC_EXPORT( int,  vlc_mutex_init_recursive, ( vlc_mutex_t * ) );
+VLC_EXPORT( void, vlc_mutex_init,    ( vlc_mutex_t * ) );
+VLC_EXPORT( void, vlc_mutex_init_recursive, ( vlc_mutex_t * ) );
 VLC_EXPORT( void, vlc_mutex_destroy, ( vlc_mutex_t * ) );
 VLC_EXPORT( void, vlc_mutex_lock, ( vlc_mutex_t * ) );
 VLC_EXPORT( int,  vlc_mutex_trylock, ( vlc_mutex_t * ) LIBVLC_USED );
 VLC_EXPORT( void, vlc_mutex_unlock, ( vlc_mutex_t * ) );
-VLC_EXPORT( int,  vlc_cond_init,     ( vlc_cond_t * ) );
+VLC_EXPORT( void, vlc_cond_init,     ( vlc_cond_t * ) );
 VLC_EXPORT( void, vlc_cond_destroy,  ( vlc_cond_t * ) );
 VLC_EXPORT( void, vlc_cond_signal, (vlc_cond_t *) );
 VLC_EXPORT( void, vlc_cond_broadcast, (vlc_cond_t *) );
 VLC_EXPORT( void, vlc_cond_wait, (vlc_cond_t *, vlc_mutex_t *) );
 VLC_EXPORT( int, vlc_cond_timedwait, (vlc_cond_t *, vlc_mutex_t *, mtime_t) );
+VLC_EXPORT( void, vlc_rwlock_init, (vlc_rwlock_t *) );
+VLC_EXPORT( void, vlc_rwlock_destroy, (vlc_rwlock_t *) );
+VLC_EXPORT( void, vlc_rwlock_rdlock, (vlc_rwlock_t *) );
+VLC_EXPORT( void, vlc_rwlock_wrlock, (vlc_rwlock_t *) );
+VLC_EXPORT( void, vlc_rwlock_unlock, (vlc_rwlock_t *) );
 VLC_EXPORT( int, vlc_threadvar_create, (vlc_threadvar_t * , void (*) (void *) ) );
 VLC_EXPORT( void, vlc_threadvar_delete, (vlc_threadvar_t *) );
 VLC_EXPORT( int, vlc_threadvar_set, (vlc_threadvar_t, void *) );
@@ -164,6 +182,11 @@ VLC_EXPORT( void, vlc_cancel, (vlc_thread_t) );
 VLC_EXPORT( void, vlc_join, (vlc_thread_t, void **) );
 VLC_EXPORT (void, vlc_control_cancel, (int cmd, ...));
 
+VLC_EXPORT( int, vlc_timer_create, (vlc_timer_t *, void (*) (void *), void *) LIBVLC_USED );
+VLC_EXPORT( void, vlc_timer_destroy, (vlc_timer_t) );
+VLC_EXPORT( void, vlc_timer_schedule, (vlc_timer_t, bool, mtime_t, mtime_t) );
+VLC_EXPORT( unsigned, vlc_timer_getoverrun, (vlc_timer_t) LIBVLC_USED );
+
 #ifndef LIBVLC_USE_PTHREAD_CANCEL
 enum {
     VLC_DO_CANCEL,
@@ -212,7 +235,7 @@ struct vlc_cleanup_t
 };
 
 /* This macros opens a code block on purpose. This is needed for multiple
- * calls within a single function. This also prevent Win32 developpers from
+ * calls within a single function. This also prevent Win32 developers from
  * writing code that would break on POSIX (POSIX opens a block as well). */
 # define vlc_cleanup_push( routine, arg ) \
     do { \
@@ -242,9 +265,10 @@ typedef pthread_spinlock_t vlc_spinlock_t;
 /**
  * Initializes a spinlock.
  */
-static inline int vlc_spin_init (vlc_spinlock_t *spin)
+static inline void vlc_spin_init (vlc_spinlock_t *spin)
 {
-    return pthread_spin_init (spin, PTHREAD_PROCESS_PRIVATE);
+    if (pthread_spin_init (spin, PTHREAD_PROCESS_PRIVATE))
+        abort ();
 }
 
 /**
@@ -278,9 +302,10 @@ typedef CRITICAL_SECTION vlc_spinlock_t;
 /**
  * Initializes a spinlock.
  */
-static inline int vlc_spin_init (vlc_spinlock_t *spin)
+static inline void vlc_spin_init (vlc_spinlock_t *spin)
 {
-    return !InitializeCriticalSectionAndSpinCount(spin, 4000);
+    if (!InitializeCriticalSectionAndSpinCount(spin, 4000))
+        abort ();
 }
 
 /**
@@ -312,9 +337,9 @@ static inline void vlc_spin_destroy (vlc_spinlock_t *spin)
 /* Fallback to plain mutexes if spinlocks are not available */
 typedef vlc_mutex_t vlc_spinlock_t;
 
-static inline int vlc_spin_init (vlc_spinlock_t *spin)
+static inline void vlc_spin_init (vlc_spinlock_t *spin)
 {
-    return vlc_mutex_init (spin);
+    vlc_mutex_init (spin);
 }
 
 # define vlc_spin_lock    vlc_mutex_lock