vlc | branch: master | Rémi Denis-Courmont <[email protected]> | Wed Jun 1 00:29:59 2016 +0300| [dbfafd71bd7cb26cf1d92c961ab2ae38d0ee263d] | committer: Rémi Denis-Courmont
win32: use futex-based semaphore (Windows 8+) > http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=dbfafd71bd7cb26cf1d92c961ab2ae38d0ee263d --- include/vlc_threads.h | 12 ++++++++---- src/misc/threads.c | 4 ++++ src/win32/thread.c | 12 +++++++----- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/include/vlc_threads.h b/include/vlc_threads.h index d3ea0ac..b0872bc 100644 --- a/include/vlc_threads.h +++ b/include/vlc_threads.h @@ -67,10 +67,14 @@ typedef struct CRITICAL_SECTION mutex; }; } vlc_mutex_t; -#define VLC_STATIC_MUTEX { false, { { false, 0 } } } -#define LIBVLC_NEED_CONDVAR -typedef HANDLE vlc_sem_t; -#define LIBVLC_NEED_RWLOCK +# define VLC_STATIC_MUTEX { false, { { false, 0 } } } +# define LIBVLC_NEED_CONDVAR +typedef union +{ + unsigned value; + HANDLE handle; +} vlc_sem_t; +# define LIBVLC_NEED_RWLOCK typedef struct vlc_threadvar *vlc_threadvar_t; typedef struct vlc_timer *vlc_timer_t; diff --git a/src/misc/threads.c b/src/misc/threads.c index 6451274..eec58a3 100644 --- a/src/misc/threads.c +++ b/src/misc/threads.c @@ -69,6 +69,10 @@ static void vlc_cancel_addr_finish(void *addr) /* Act on cancellation as potential wake-up source */ vlc_testcancel(); } + +# if defined (_WIN32) && (_WIN32_WINNT >= _WIN32_WINNT_WIN8) +# define LIBVLC_NEED_SEMAPHORE +# endif #endif #ifdef LIBVLC_NEED_SLEEP diff --git a/src/win32/thread.c b/src/win32/thread.c index 8d74d6f..49e533e 100644 --- a/src/win32/thread.c +++ b/src/win32/thread.c @@ -216,21 +216,22 @@ void vlc_mutex_unlock (vlc_mutex_t *p_mutex) } /*** Semaphore ***/ +#if (_WIN32_WINNT < _WIN32_WINNT_WIN8) void vlc_sem_init (vlc_sem_t *sem, unsigned value) { - *sem = CreateSemaphore (NULL, value, 0x7fffffff, NULL); - if (*sem == NULL) + sem->handle = CreateSemaphore(NULL, value, 0x7fffffff, NULL); + if (sem->handle == NULL) abort (); } void vlc_sem_destroy (vlc_sem_t *sem) { - CloseHandle (*sem); + CloseHandle(sem->handle); } int vlc_sem_post (vlc_sem_t *sem) { - ReleaseSemaphore (*sem, 1, NULL); + ReleaseSemaphore(sem->handle, 1, NULL); return 0; /* FIXME */ } @@ -241,10 +242,11 @@ void vlc_sem_wait (vlc_sem_t *sem) do { vlc_testcancel (); - result = vlc_WaitForSingleObject (*sem, INFINITE); + result = vlc_WaitForSingleObject(sem->value, INFINITE); } while (result == WAIT_IO_COMPLETION); } +#endif /*** Thread-specific variables (TLS) ***/ struct vlc_threadvar _______________________________________________ vlc-commits mailing list [email protected] https://mailman.videolan.org/listinfo/vlc-commits
