X-Git-Url: https://git.sesse.net/?a=blobdiff_plain;f=include%2Fvlc_threads.h;h=e7acc8d704d2111c33dee82bfe33046848528952;hb=c62a73d1f5ed365e33d1f3d4f855f2737e29c476;hp=18397723ff5bf8e0a932d4190e0d525decb1b7d0;hpb=b6e52e1f2193407e820ef0e88c043cccca3e25b4;p=vlc diff --git a/include/vlc_threads.h b/include/vlc_threads.h index 18397723ff..e7acc8d704 100644 --- a/include/vlc_threads.h +++ b/include/vlc_threads.h @@ -35,7 +35,7 @@ */ #if defined( UNDER_CE ) - /* WinCE API */ +# include /* WinCE API */ #elif defined( WIN32 ) # include /* Win32 API */ # include @@ -79,15 +79,14 @@ /* 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 @@ -106,6 +105,7 @@ #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; @@ -115,16 +115,18 @@ typedef struct HANDLE handle; void *(*entry) (void *); void *data; +#if defined( UNDER_CE ) + HANDLE cancel_event; +#endif } *vlc_thread_t; typedef struct { + LONG initialized; CRITICAL_SECTION mutex; - LONG owner; - unsigned recursion; - bool recursive; -} -vlc_mutex_t; +} vlc_mutex_t; +#define VLC_STATIC_MUTEX { 0, } + typedef HANDLE vlc_cond_t; typedef DWORD vlc_threadvar_t; @@ -150,7 +152,7 @@ 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_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 * ) ); @@ -161,68 +163,15 @@ VLC_EXPORT (void, vlc_control_cancel, (int cmd, ...)); #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 - -#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) /** @@ -364,7 +313,12 @@ typedef CRITICAL_SECTION vlc_spinlock_t; */ static inline int vlc_spin_init (vlc_spinlock_t *spin) { +#ifdef UNDER_CE + InitializeCriticalSection(spin); + return 0; +#else return !InitializeCriticalSectionAndSpinCount(spin, 4000); +#endif } /** @@ -421,7 +375,7 @@ static inline void barrier (void) 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; @@ -435,8 +389,8 @@ static inline void barrier (void) /***************************************************************************** * 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 @@ -450,4 +404,27 @@ static inline void barrier (void) #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 */