*/
#if defined( UNDER_CE )
- /* WinCE API */
+# include <errno.h> /* WinCE API */
#elif defined( WIN32 )
# include <process.h> /* Win32 API */
# include <errno.h>
/* Define different priorities for WinNT/2K/XP and Win9x/Me */
# define VLC_THREAD_PRIORITY_LOW 0
# define VLC_THREAD_PRIORITY_INPUT \
- (IS_WINNT ? THREAD_PRIORITY_ABOVE_NORMAL : 0)
+ THREAD_PRIORITY_ABOVE_NORMAL
# define VLC_THREAD_PRIORITY_AUDIO \
- (IS_WINNT ? THREAD_PRIORITY_HIGHEST : 0)
-# define VLC_THREAD_PRIORITY_VIDEO \
- (IS_WINNT ? 0 : THREAD_PRIORITY_BELOW_NORMAL )
+ THREAD_PRIORITY_HIGHEST
+# define VLC_THREAD_PRIORITY_VIDEO 0
# define VLC_THREAD_PRIORITY_OUTPUT \
- (IS_WINNT ? THREAD_PRIORITY_ABOVE_NORMAL : 0)
+ THREAD_PRIORITY_ABOVE_NORMAL
# define VLC_THREAD_PRIORITY_HIGHEST \
- (IS_WINNT ? THREAD_PRIORITY_TIME_CRITICAL : 0)
+ THREAD_PRIORITY_TIME_CRITICAL
#else
# define VLC_THREAD_PRIORITY_LOW 0
#if defined (LIBVLC_USE_PTHREAD)
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_key_t vlc_threadvar_t;
-#elif defined( WIN32 ) || defined( UNDER_CE )
+#elif defined( WIN32 )
typedef struct
{
HANDLE handle;
void *(*entry) (void *);
void *data;
+#if defined( UNDER_CE )
+ HANDLE cancel_event;
+#endif
} *vlc_thread_t;
-typedef HANDLE vlc_mutex_t;
+typedef struct
+{
+ LONG initialized;
+ CRITICAL_SECTION mutex;
+} vlc_mutex_t;
+#define VLC_STATIC_MUTEX { 0, }
+
typedef HANDLE vlc_cond_t;
typedef DWORD vlc_threadvar_t;
VLC_EXPORT( int, vlc_cond_timedwait, (vlc_cond_t *, vlc_mutex_t *, mtime_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_thread_create, ( vlc_object_t *, const char *, int, const char *, void * ( * ) ( vlc_object_t * ), int, bool ) );
+VLC_EXPORT( int, vlc_thread_create, ( vlc_object_t *, const char *, int, const char *, void * ( * ) ( vlc_object_t * ), int ) );
VLC_EXPORT( int, __vlc_thread_set_priority, ( vlc_object_t *, const char *, int, int ) );
VLC_EXPORT( void, __vlc_thread_join, ( vlc_object_t * ) );
#ifndef LIBVLC_USE_PTHREAD_CANCEL
enum {
- VLC_SAVE_CANCEL,
- VLC_RESTORE_CANCEL,
- VLC_TEST_CANCEL,
VLC_DO_CANCEL,
VLC_CLEANUP_PUSH,
VLC_CLEANUP_POP,
};
#endif
-#define vlc_thread_ready vlc_object_signal
-
-VLC_EXPORT(void, vlc_thread_fatal, (const char *action, int error, const char *function, const char *file, unsigned line));
-
-#if defined(LIBVLC_USE_PTHREAD)
-# define vlc_assert_locked( m ) \
- assert (pthread_mutex_lock (m) == EDEADLK)
-#else
-# define vlc_assert_locked( m ) (void)m
-#endif
-
-/**
- * Save the cancellation state and disable cancellation for the calling thread.
- * This function must be called before entering a piece of code that is not
- * cancellation-safe.
- * @return Previous cancellation state (opaque value).
- */
-static inline int vlc_savecancel (void)
-{
- int state;
-#if defined (LIBVLC_USE_PTHREAD_CANCEL)
- (void) pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &state);
-#else
- vlc_control_cancel (VLC_SAVE_CANCEL, &state);
-#endif
- return state;
-}
-
-/**
- * Restore the cancellation state for the calling thread.
- * @param state previous state as returned by vlc_savecancel().
- * @return Nothing, always succeeds.
- */
-static inline void vlc_restorecancel (int state)
-{
-#if defined (LIBVLC_USE_PTHREAD_CANCEL)
- (void) pthread_setcancelstate (state, NULL);
-#else
- vlc_control_cancel (VLC_RESTORE_CANCEL, state);
-#endif
-}
-
-/**
- * Issues an explicit deferred cancellation point.
- * This has no effect if thread cancellation is disabled.
- * This can be called when there is a rather slow non-sleeping operation.
- */
-static inline void vlc_testcancel (void)
-{
-#if defined (LIBVLC_USE_PTHREAD_CANCEL)
- pthread_testcancel ();
-#else
- vlc_control_cancel (VLC_TEST_CANCEL);
-#endif
-}
+VLC_EXPORT( int, vlc_savecancel, (void) );
+VLC_EXPORT( void, vlc_restorecancel, (int state) );
+VLC_EXPORT( void, vlc_testcancel, (void) );
#if defined (LIBVLC_USE_PTHREAD_CANCEL)
/**
*/
static inline int vlc_spin_init (vlc_spinlock_t *spin)
{
+#ifdef UNDER_CE
+ InitializeCriticalSection(spin);
+ return 0;
+#else
return !InitializeCriticalSectionAndSpinCount(spin, 4000);
+#endif
}
/**
#endif
static inline void barrier (void)
{
-#if defined (__GNUC__) && (__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1)
+#if defined (__GNUC__) && \
+ ((__GNUC__ > 4) || (__GNUC__ == 4 && __GNUC_MINOR__ >= 1))
__sync_synchronize ();
#elif defined(__APPLE__)
OSMemoryBarrier ();
#elif defined(__powerpc__)
asm volatile ("sync":::"memory");
-#elif defined(__i386__)
+#elif 0 // defined(__i386__) /* Requires SSE2 support */
asm volatile ("mfence":::"memory");
#else
vlc_spinlock_t spin;
/*****************************************************************************
* vlc_thread_create: create a thread
*****************************************************************************/
-#define vlc_thread_create( P_THIS, PSZ_NAME, FUNC, PRIORITY, WAIT ) \
- __vlc_thread_create( VLC_OBJECT(P_THIS), __FILE__, __LINE__, PSZ_NAME, FUNC, PRIORITY, WAIT )
+#define vlc_thread_create( P_THIS, PSZ_NAME, FUNC, PRIORITY ) \
+ vlc_thread_create( VLC_OBJECT(P_THIS), __FILE__, __LINE__, PSZ_NAME, FUNC, PRIORITY )
/*****************************************************************************
* vlc_thread_set_priority: set the priority of the calling thread
#define vlc_thread_join( P_THIS ) \
__vlc_thread_join( VLC_OBJECT(P_THIS) )
+#ifdef __cplusplus
+/**
+ * Helper C++ class to lock a mutex.
+ * The mutex is locked when the object is created, and unlocked when the object
+ * is destroyed.
+ */
+class vlc_mutex_locker
+{
+ private:
+ vlc_mutex_t *lock;
+ public:
+ vlc_mutex_locker (vlc_mutex_t *m) : lock (m)
+ {
+ vlc_mutex_lock (lock);
+ }
+
+ ~vlc_mutex_locker (void)
+ {
+ vlc_mutex_unlock (lock);
+ }
+};
+#endif
+
#endif /* !_VLC_THREADS_H */