[vlc-commits] thread: use generic semaphores on all platforms
Rémi Denis-Courmont
git at videolan.org
Mon Feb 17 17:54:59 CET 2020
vlc | branch: master | Rémi Denis-Courmont <remi at remlab.net> | Sun Feb 16 19:04:50 2020 +0200| [cf1e3e99d328c844895ccae9271bdaf3548fb1fd] | committer: Rémi Denis-Courmont
thread: use generic semaphores on all platforms
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=cf1e3e99d328c844895ccae9271bdaf3548fb1fd
---
include/vlc_threads.h | 14 --------------
src/darwin/thread.c | 45 ---------------------------------------------
src/misc/threads.c | 3 ---
src/posix/thread.c | 44 --------------------------------------------
src/win32/thread.c | 51 ---------------------------------------------------
5 files changed, 157 deletions(-)
diff --git a/include/vlc_threads.h b/include/vlc_threads.h
index 688855ca72..584b6416b1 100644
--- a/include/vlc_threads.h
+++ b/include/vlc_threads.h
@@ -70,7 +70,6 @@ typedef struct
} vlc_mutex_t;
#define VLC_STATIC_MUTEX { false, { { false, 0 } } }
#define LIBVLC_NEED_CONDVAR
-#define LIBVLC_NEED_SEMAPHORE
#define LIBVLC_NEED_RWLOCK
typedef INIT_ONCE vlc_once_t;
#define VLC_STATIC_ONCE INIT_ONCE_STATIC_INIT
@@ -123,7 +122,6 @@ typedef struct
unsigned signaled;
} vlc_cond_t;
#define VLC_STATIC_COND { NULLHANDLE, 0, NULLHANDLE, 0 }
-#define LIBVLC_NEED_SEMAPHORE
#define LIBVLC_NEED_RWLOCK
typedef struct
{
@@ -172,7 +170,6 @@ static inline int vlc_poll (struct pollfd *fds, unsigned nfds, int timeout)
# define LIBVLC_USE_PTHREAD_CLEANUP 1
# define LIBVLC_NEED_SLEEP
# define LIBVLC_NEED_CONDVAR
-# define LIBVLC_NEED_SEMAPHORE
# define LIBVLC_NEED_RWLOCK
typedef struct vlc_thread *vlc_thread_t;
@@ -226,7 +223,6 @@ 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 semaphore_t vlc_sem_t;
typedef pthread_rwlock_t vlc_rwlock_t;
#define VLC_STATIC_RWLOCK PTHREAD_RWLOCK_INITIALIZER
typedef pthread_once_t vlc_once_t;
@@ -244,7 +240,6 @@ typedef struct vlc_timer *vlc_timer_t;
#else /* POSIX threads */
# include <unistd.h> /* _POSIX_SPIN_LOCKS */
# include <pthread.h>
-# include <semaphore.h>
/**
* Whether LibVLC threads are based on POSIX threads.
@@ -299,13 +294,6 @@ typedef pthread_cond_t vlc_cond_t;
*/
#define VLC_STATIC_COND PTHREAD_COND_INITIALIZER
-/**
- * Semaphore.
- *
- * Storage space for a thread-safe semaphore.
- */
-typedef sem_t vlc_sem_t;
-
/**
* Read/write lock.
*
@@ -367,7 +355,6 @@ typedef struct
# define VLC_STATIC_COND { 0 }
#endif
-#ifdef LIBVLC_NEED_SEMAPHORE
typedef struct vlc_sem
{
union {
@@ -377,7 +364,6 @@ typedef struct vlc_sem
int dummy;
};
} vlc_sem_t;
-#endif
#ifdef LIBVLC_NEED_RWLOCK
typedef struct vlc_rwlock
diff --git a/src/darwin/thread.c b/src/darwin/thread.c
index 1eca7755d2..349a4935f3 100644
--- a/src/darwin/thread.c
+++ b/src/darwin/thread.c
@@ -312,51 +312,6 @@ int vlc_cond_timedwait_daytime (vlc_cond_t *p_condvar, vlc_mutex_t *p_mutex,
}
-/* Initialize a semaphore. */
-void vlc_sem_init (vlc_sem_t *sem, unsigned value)
-{
- if (unlikely(semaphore_create(mach_task_self(), sem, SYNC_POLICY_FIFO, value) != KERN_SUCCESS))
- abort ();
-}
-
-void vlc_sem_destroy (vlc_sem_t *sem)
-{
- int val;
-
- if (likely(semaphore_destroy(mach_task_self(), *sem) == KERN_SUCCESS))
- return;
-
- val = EINVAL;
-
- VLC_THREAD_ASSERT ("destroying semaphore");
-}
-
-int vlc_sem_post (vlc_sem_t *sem)
-{
- int val;
-
- if (likely(semaphore_signal(*sem) == KERN_SUCCESS))
- return 0;
-
- val = EINVAL;
-
- if (unlikely(val != EOVERFLOW))
- VLC_THREAD_ASSERT ("unlocking semaphore");
- return val;
-}
-
-void vlc_sem_wait (vlc_sem_t *sem)
-{
- int val;
-
- if (likely(semaphore_wait(*sem) == KERN_SUCCESS))
- return;
-
- val = EINVAL;
-
- VLC_THREAD_ASSERT ("locking semaphore");
-}
-
void vlc_rwlock_init (vlc_rwlock_t *lock)
{
if (unlikely(pthread_rwlock_init (lock, NULL)))
diff --git a/src/misc/threads.c b/src/misc/threads.c
index 8f365efad8..edd10bf7b4 100644
--- a/src/misc/threads.c
+++ b/src/misc/threads.c
@@ -153,7 +153,6 @@ bool vlc_mutex_marked(const vlc_mutex_t *mutex)
#if defined (_WIN32) && (_WIN32_WINNT < _WIN32_WINNT_WIN8)
/* Cannot define OS version-dependent stuff in public headers */
# undef LIBVLC_NEED_SLEEP
-# undef LIBVLC_NEED_SEMAPHORE
#endif
#if defined(LIBVLC_NEED_SLEEP) || defined(LIBVLC_NEED_CONDVAR)
@@ -397,7 +396,6 @@ void vlc_rwlock_unlock (vlc_rwlock_t *lock)
}
#endif /* LIBVLC_NEED_RWLOCK */
-#ifdef LIBVLC_NEED_SEMAPHORE
/*** Generic semaphores ***/
void vlc_sem_init (vlc_sem_t *sem, unsigned value)
@@ -441,4 +439,3 @@ void vlc_sem_wait (vlc_sem_t *sem)
}
}
}
-#endif /* LIBVLC_NEED_SEMAPHORE */
diff --git a/src/posix/thread.c b/src/posix/thread.c
index dfe0ea7c9d..9c9271a100 100644
--- a/src/posix/thread.c
+++ b/src/posix/thread.c
@@ -226,50 +226,6 @@ int vlc_cond_timedwait_daytime (vlc_cond_t *p_condvar, vlc_mutex_t *p_mutex,
return val;
}
-void vlc_sem_init (vlc_sem_t *sem, unsigned value)
-{
- if (unlikely(sem_init (sem, 0, value)))
- abort ();
-}
-
-void vlc_sem_destroy (vlc_sem_t *sem)
-{
- int val;
-
- if (likely(sem_destroy (sem) == 0))
- return;
-
- val = errno;
-
- VLC_THREAD_ASSERT ("destroying semaphore");
-}
-
-int vlc_sem_post (vlc_sem_t *sem)
-{
- int val;
-
- if (likely(sem_post (sem) == 0))
- return 0;
-
- val = errno;
-
- if (unlikely(val != EOVERFLOW))
- VLC_THREAD_ASSERT ("unlocking semaphore");
- return val;
-}
-
-void vlc_sem_wait (vlc_sem_t *sem)
-{
- int val;
-
- do
- if (likely(sem_wait (sem) == 0))
- return;
- while ((val = errno) == EINTR);
-
- VLC_THREAD_ASSERT ("locking semaphore");
-}
-
void vlc_rwlock_init (vlc_rwlock_t *lock)
{
if (unlikely(pthread_rwlock_init (lock, NULL)))
diff --git a/src/win32/thread.c b/src/win32/thread.c
index 7bc6196519..4d6d7bdb5d 100644
--- a/src/win32/thread.c
+++ b/src/win32/thread.c
@@ -154,57 +154,6 @@ void vlc_mutex_unlock (vlc_mutex_t *p_mutex)
vlc_mutex_unmark(p_mutex);
}
-/*** Semaphore ***/
-#if (_WIN32_WINNT < _WIN32_WINNT_WIN8)
-# include <stdalign.h>
-
-static inline HANDLE *vlc_sem_handle_p(vlc_sem_t *sem)
-{
- /* NOTE: vlc_sem_t layout cannot easily depend on Windows version */
- static_assert (sizeof (HANDLE) <= sizeof (vlc_sem_t), "Size mismatch!");
- static_assert ((alignof (HANDLE) % alignof (vlc_sem_t)) == 0,
- "Alignment mismatch");
- return (HANDLE *)sem;
-}
-#define vlc_sem_handle(sem) (*vlc_sem_handle_p(sem))
-
-void vlc_sem_init (vlc_sem_t *sem, unsigned value)
-{
- HANDLE handle = CreateSemaphore(NULL, value, 0x7fffffff, NULL);
- if (handle == NULL)
- abort ();
-
- vlc_sem_handle(sem) = handle;
-}
-
-void vlc_sem_destroy (vlc_sem_t *sem)
-{
- CloseHandle(vlc_sem_handle(sem));
-}
-
-int vlc_sem_post (vlc_sem_t *sem)
-{
- ReleaseSemaphore(vlc_sem_handle(sem), 1, NULL);
- return 0; /* FIXME */
-}
-
-void vlc_sem_wait (vlc_sem_t *sem)
-{
- HANDLE handle = vlc_sem_handle(sem);
- DWORD result;
-
- do
- {
- vlc_testcancel ();
- result = WaitForSingleObjectEx(handle, INFINITE, TRUE);
-
- /* Semaphore abandoned would be a bug. */
- assert(result != WAIT_ABANDONED_0);
- }
- while (result == WAIT_IO_COMPLETION || result == WAIT_FAILED);
-}
-#endif
-
/*** One-time initialization ***/
static BOOL CALLBACK vlc_once_callback(INIT_ONCE *once, void *parm, void **ctx)
{
More information about the vlc-commits
mailing list