*
*/
-#if defined (WIN32)
+#if defined (_WIN32)
# include <process.h>
# ifndef ETIMEDOUT
# define ETIMEDOUT 10060 /* This is the value in winsock.h. */
typedef struct vlc_thread *vlc_thread_t;
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 struct
+{
+ pthread_cond_t cond;
+ unsigned clock;
+} vlc_cond_t;
+#define VLC_STATIC_COND { PTHREAD_COND_INITIALIZER, CLOCK_REALTIME }
typedef pthread_key_t vlc_threadvar_t;
typedef struct vlc_timer *vlc_timer_t;
/* Unnamed POSIX semaphores not supported on Mac OS X */
# include <mach/semaphore.h>
# include <mach/task.h>
-# include <libkern/OSAtomic.h> /* OSMemoryBarrier() */
# define LIBVLC_USE_PTHREAD 1
# define LIBVLC_USE_PTHREAD_CLEANUP 1
# define LIBVLC_USE_PTHREAD_CANCEL 1
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;
-#define VLC_STATIC_COND PTHREAD_COND_INITIALIZER
+typedef struct
+{
+ pthread_cond_t cond;
+ unsigned clock;
+} vlc_cond_t;
+#define VLC_STATIC_COND { PTHREAD_COND_INITIALIZER, 0 }
typedef semaphore_t vlc_sem_t;
typedef pthread_rwlock_t vlc_rwlock_t;
#define VLC_STATIC_RWLOCK PTHREAD_RWLOCK_INITIALIZER
vlc_cleanup_data.proc (vlc_cleanup_data.data); \
} while (0)
-#endif /* !LIBVLC_USE_PTHREAD_CLEANUO */
+#endif /* !LIBVLC_USE_PTHREAD_CLEANUP */
#ifndef LIBVLC_USE_PTHREAD_CANCEL
/* poll() with cancellation */
+# ifdef __OS2__
static inline int vlc_poll (struct pollfd *fds, unsigned nfds, int timeout)
{
- vlc_testcancel ();
+ static int (*vlc_poll_os2)(struct pollfd *, unsigned, int) = NULL;
- while (timeout > 50)
+ if (!vlc_poll_os2)
{
- int val = poll (fds, nfds, timeout);
- if (val != 0)
- return val;
- timeout -= 50;
- vlc_testcancel ();
- }
+ HMODULE hmod;
+ CHAR szFailed[CCHMAXPATH];
- return poll (fds, nfds, timeout);
-}
-# define poll(u,n,t) vlc_poll(u, n, t)
-
-#endif /* LIBVLC_USE_PTHREAD_CANCEL */
-
-static inline void vlc_cleanup_lock (void *lock)
-{
- vlc_mutex_unlock ((vlc_mutex_t *)lock);
-}
-#define mutex_cleanup_push( lock ) vlc_cleanup_push (vlc_cleanup_lock, lock)
-
-#if defined (_POSIX_SPIN_LOCKS) && ((_POSIX_SPIN_LOCKS - 0) > 0)
-typedef pthread_spinlock_t vlc_spinlock_t;
-
-/**
- * Initializes a spinlock.
- */
-static inline void vlc_spin_init (vlc_spinlock_t *spin)
-{
- if (pthread_spin_init (spin, PTHREAD_PROCESS_PRIVATE))
- abort ();
-}
-
-/**
- * Acquires a spinlock.
- */
-static inline void vlc_spin_lock (vlc_spinlock_t *spin)
-{
- pthread_spin_lock (spin);
-}
+ if (DosLoadModule(szFailed, sizeof(szFailed), "vlccore", &hmod))
+ return -1;
-/**
- * Releases a spinlock.
- */
-static inline void vlc_spin_unlock (vlc_spinlock_t *spin)
-{
- pthread_spin_unlock (spin);
-}
+ if (DosQueryProcAddr(hmod, 0, "_vlc_poll_os2", (PFN *)&vlc_poll_os2))
+ return -1;
+ }
-/**
- * Deinitializes a spinlock.
- */
-static inline void vlc_spin_destroy (vlc_spinlock_t *spin)
-{
- pthread_spin_destroy (spin);
+ return (*vlc_poll_os2)(fds, nfds, timeout);
}
-
-#elif defined (WIN32)
-typedef CRITICAL_SECTION vlc_spinlock_t;
-
-static inline void vlc_spin_init (vlc_spinlock_t *spin)
+# else
+static inline int vlc_poll (struct pollfd *fds, unsigned nfds, int timeout)
{
- if (!InitializeCriticalSectionAndSpinCount(spin, 4000))
- abort ();
-}
+ int val;
-static inline void vlc_spin_lock (vlc_spinlock_t *spin)
-{
- EnterCriticalSection(spin);
-}
+ do
+ {
+ int ugly_timeout = ((unsigned)timeout >= 50) ? 50 : timeout;
+ if (timeout >= 0)
+ timeout -= ugly_timeout;
-static inline void vlc_spin_unlock (vlc_spinlock_t *spin)
-{
- LeaveCriticalSection(spin);
-}
+ vlc_testcancel ();
+ val = poll (fds, nfds, ugly_timeout);
+ }
+ while (val == 0 && timeout != 0);
-static inline void vlc_spin_destroy (vlc_spinlock_t *spin)
-{
- DeleteCriticalSection(spin);
+ return val;
}
+# endif
-#else
-/* Fallback to plain mutexes if spinlocks are not available */
-typedef vlc_mutex_t vlc_spinlock_t;
-
-static inline void vlc_spin_init (vlc_spinlock_t *spin)
-{
- vlc_mutex_init (spin);
-}
+# define poll(u,n,t) vlc_poll(u, n, t)
-# define vlc_spin_lock vlc_mutex_lock
-# define vlc_spin_unlock vlc_mutex_unlock
-# define vlc_spin_destroy vlc_mutex_destroy
-#endif
+#endif /* LIBVLC_USE_PTHREAD_CANCEL */
-/**
- * Issues a full memory barrier.
- */
-static inline void barrier (void)
+static inline void vlc_cleanup_lock (void *lock)
{
-#if defined (__GNUC__) && !defined (__APPLE__) && \
- ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1))
- __sync_synchronize ();
-#elif defined(__APPLE__)
- OSMemoryBarrier ();
-#elif defined(__powerpc__)
- asm volatile ("sync":::"memory");
-#elif 0 // defined(__i386__) /* Requires SSE2 support */
- asm volatile ("mfence":::"memory");
-#else
- vlc_spinlock_t spin;
- vlc_spin_init (&spin);
- vlc_spin_lock (&spin);
- vlc_spin_unlock (&spin);
- vlc_spin_destroy (&spin);
-#endif
+ vlc_mutex_unlock ((vlc_mutex_t *)lock);
}
+#define mutex_cleanup_push( lock ) vlc_cleanup_push (vlc_cleanup_lock, lock)
#ifdef __cplusplus
/**