*/
#if defined( UNDER_CE )
-# include <errno.h> /* WinCE API */
#elif defined( WIN32 )
# include <process.h> /* Win32 API */
-# include <errno.h>
#else /* pthreads (like Linux & BSD) */
# define LIBVLC_USE_PTHREAD 1
# define LIBVLC_USE_PTHREAD_CANCEL 1
# define _APPLE_C_SOURCE 1 /* Proper pthread semantics on OSX */
-# include <stdlib.h> /* lldiv_t definition (only in C99) */
# include <unistd.h> /* _POSIX_SPIN_LOCKS */
# include <pthread.h>
- /* Needed for pthread_cond_timedwait */
-# include <errno.h>
-# include <time.h>
+# include <semaphore.h>
#endif
typedef pthread_mutex_t vlc_mutex_t;
#define VLC_STATIC_MUTEX PTHREAD_MUTEX_INITIALIZER
typedef pthread_cond_t vlc_cond_t;
+#define VLC_STATIC_COND PTHREAD_COND_INITIALIZER
+typedef sem_t vlc_sem_t;
+typedef pthread_rwlock_t vlc_rwlock_t;
typedef pthread_key_t vlc_threadvar_t;
-typedef struct vlc_timer_t vlc_timer_t;
-struct vlc_timer_t
-{
- timer_t handle;
- void (*func) (vlc_timer_t *, void *);
- void *data;
-};
+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
{
- LONG initialized;
- CRITICAL_SECTION mutex;
+ bool dynamic;
+ union
+ {
+ struct
+ {
+ bool locked;
+ unsigned long contention;
+ };
+ CRITICAL_SECTION mutex;
+ };
} vlc_mutex_t;
-#define VLC_STATIC_MUTEX { 0, }
+#define VLC_STATIC_MUTEX { false, { { false, 0 } } }
typedef HANDLE vlc_cond_t;
-typedef DWORD vlc_threadvar_t;
-typedef struct vlc_timer_t vlc_timer_t;
-struct vlc_timer_t
+typedef HANDLE vlc_sem_t;
+
+typedef struct
{
- HANDLE handle;
- void (*func) (vlc_timer_t *, void *);
- void *data;
- unsigned overrun;
- CRITICAL_SECTION serializer;
- LONG volatile counter;
-};
+ 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
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( int, vlc_cond_timedwait, (vlc_cond_t *, vlc_mutex_t *, mtime_t) );
+VLC_EXPORT( void, vlc_sem_init, (vlc_sem_t *, unsigned) );
+VLC_EXPORT( void, vlc_sem_destroy, (vlc_sem_t *) );
+VLC_EXPORT( int, vlc_sem_post, (vlc_sem_t *) );
+VLC_EXPORT( void, vlc_sem_wait, (vlc_sem_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 *) );
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 (*) (vlc_timer_t *, 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, (const vlc_timer_t *) );
+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 {
};
/* 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 { \