[vlc-devel] [PATCH 3/7] thread: use generic semaphores on all platforms
Thomas Guillem
thomas at gllm.fr
Mon Feb 17 13:43:54 CET 2020
I was about to answer to your previous patch that we could use the OS semaphore for Android and Windows.
But you are now removing all OS implementation. It deserves a git message explaining why.
I'm curious to know the reason too. Is it for the timed_sem ?
On Sun, Feb 16, 2020, at 18:50, RĂ©mi Denis-Courmont wrote:
> ---
> 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 82bd5b60fc..ccf002be62 100644
> --- a/src/misc/threads.c
> +++ b/src/misc/threads.c
> @@ -145,7 +145,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)
> @@ -396,7 +395,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)
> @@ -440,4 +438,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)
> {
> --
> 2.25.0
>
> _______________________________________________
> vlc-devel mailing list
> To unsubscribe or modify your subscription options:
> https://mailman.videolan.org/listinfo/vlc-devel
More information about the vlc-devel
mailing list