[vlc-devel] [PATCH v2] thread: use posix thread code for darwin
Marvin Scholz
epirat07 at gmail.com
Wed Apr 1 21:29:26 CEST 2020
---
include/vlc_threads.h | 25 ----
src/Makefile.am | 10 +-
src/darwin/thread.c | 319 ------------------------------------------
3 files changed, 5 insertions(+), 349 deletions(-)
delete mode 100644 src/darwin/thread.c
diff --git a/include/vlc_threads.h b/include/vlc_threads.h
index 131e319622..f2a0f7a2a2 100644
--- a/include/vlc_threads.h
+++ b/include/vlc_threads.h
@@ -174,31 +174,6 @@ static inline int vlc_poll (struct pollfd *fds, unsigned nfds, int timeout)
# define poll(u,n,t) vlc_poll(u, n, t)
-#elif defined (__APPLE__)
-# define _APPLE_C_SOURCE 1 /* Proper pthread semantics on OSX */
-# include <unistd.h>
-# include <pthread.h>
-/* Unnamed POSIX semaphores not supported on Mac OS X */
-# include <mach/semaphore.h>
-# include <mach/task.h>
-# define LIBVLC_USE_PTHREAD_CLEANUP 1
-
-typedef pthread_t vlc_thread_t;
-#define VLC_THREAD_CANCELED PTHREAD_CANCELED
-typedef pthread_rwlock_t vlc_rwlock_t;
-#define VLC_STATIC_RWLOCK PTHREAD_RWLOCK_INITIALIZER
-typedef pthread_once_t vlc_once_t;
-#define VLC_STATIC_ONCE PTHREAD_ONCE_INIT
-typedef pthread_key_t vlc_threadvar_t;
-typedef struct vlc_timer *vlc_timer_t;
-
-# define VLC_THREAD_PRIORITY_LOW 0
-# define VLC_THREAD_PRIORITY_INPUT 22
-# define VLC_THREAD_PRIORITY_AUDIO 22
-# define VLC_THREAD_PRIORITY_VIDEO 0
-# define VLC_THREAD_PRIORITY_OUTPUT 22
-# define VLC_THREAD_PRIORITY_HIGHEST 22
-
#else /* POSIX threads */
# include <unistd.h> /* _POSIX_SPIN_LOCKS */
# include <pthread.h>
diff --git a/src/Makefile.am b/src/Makefile.am
index eb22687a48..88c6d903ae 100644
--- a/src/Makefile.am
+++ b/src/Makefile.am
@@ -440,8 +440,7 @@ endif
if HAVE_DARWIN
libvlccore_la_SOURCES += \
darwin/error.c \
- darwin/specific.c \
- darwin/thread.c
+ darwin/specific.c
libvlccore_objc_la_SOURCES = \
darwin/dirs.m \
darwin/netconf.m
@@ -481,15 +480,16 @@ if !HAVE_LINUX
libvlccore_la_SOURCES += posix/wait.c
endif
if !HAVE_ANDROID
-libvlccore_la_SOURCES += posix/sort.c
+libvlccore_la_SOURCES += \
+ posix/sort.c \
+ posix/thread.c
if !HAVE_DARWIN
libvlccore_la_SOURCES += \
posix/dirs.c \
posix/error.c \
posix/netconf.c \
posix/picture.c \
- posix/specific.c \
- posix/thread.c
+ posix/specific.c
if HAVE_LIBANL
libvlccore_la_SOURCES += \
linux/getaddrinfo.c
diff --git a/src/darwin/thread.c b/src/darwin/thread.c
deleted file mode 100644
index 13ccbeed2d..0000000000
--- a/src/darwin/thread.c
+++ /dev/null
@@ -1,319 +0,0 @@
-/*****************************************************************************
- * thread.c : pthread back-end for LibVLC
- *****************************************************************************
- * Copyright (C) 1999-2013 VLC authors and VideoLAN
- *
- * Authors: Jean-Marc Dressler <polux at via.ecp.fr>
- * Samuel Hocevar <sam at zoy.org>
- * Gildas Bazin <gbazin at netcourrier.com>
- * Clément Sténac
- * Rémi Denis-Courmont
- * Felix Paul Kühne <fkuehne # videolan.org>
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms of the GNU Lesser General Public License as published by
- * the Free Software Foundation; either version 2.1 of the License, or
- * (at your option) any later version.
- *
- * This program is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
- * GNU Lesser General Public License for more details.
- *
- * You should have received a copy of the GNU Lesser General Public License
- * along with this program; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
- *****************************************************************************/
-
-#ifdef HAVE_CONFIG_H
-# include "config.h"
-#endif
-
-#include <vlc_common.h>
-#include <stdatomic.h>
-
-#include "libvlc.h"
-#include <signal.h>
-#include <errno.h>
-#include <assert.h>
-
-#include <pthread.h>
-#include <mach/mach_init.h> /* mach_task_self in semaphores */
-#include <mach/mach_time.h>
-#include <execinfo.h>
-
-static struct {
- uint32_t quotient;
- uint32_t remainder;
- uint32_t divider;
-} vlc_clock_conversion;
-
-static void vlc_clock_setup_once (void)
-{
- mach_timebase_info_data_t timebase;
- if (unlikely(mach_timebase_info (&timebase) != 0))
- abort ();
- lldiv_t d = lldiv (timebase.numer, timebase.denom);
- vlc_clock_conversion.quotient = (uint32_t)d.quot;
- vlc_clock_conversion.remainder = (uint32_t)d.rem;
- vlc_clock_conversion.divider = timebase.denom;
-}
-
-static pthread_once_t vlc_clock_once = PTHREAD_ONCE_INIT;
-
-#define vlc_clock_setup() \
- pthread_once(&vlc_clock_once, vlc_clock_setup_once)
-
-/* Print a backtrace to the standard error for debugging purpose. */
-void vlc_trace (const char *fn, const char *file, unsigned line)
-{
- fprintf (stderr, "at %s:%u in %s\n", file, line, fn);
- fflush (stderr); /* needed before switch to low-level I/O */
- void *stack[20];
- int len = backtrace (stack, sizeof (stack) / sizeof (stack[0]));
- backtrace_symbols_fd (stack, len, 2);
- fsync (2);
-}
-
-#ifndef NDEBUG
-/* Reports a fatal error from the threading layer, for debugging purposes. */
-static void
-vlc_thread_fatal (const char *action, int error,
- const char *function, const char *file, unsigned line)
-{
- int canc = vlc_savecancel ();
- fprintf (stderr, "LibVLC fatal error %s (%d) in thread %lu ",
- action, error, vlc_thread_id ());
- vlc_trace (function, file, line);
-
- char buf[1000];
- const char *msg;
-
- switch (strerror_r (error, buf, sizeof (buf)))
- {
- case 0:
- msg = buf;
- break;
- case ERANGE: /* should never happen */
- msg = "unknown (too big to display)";
- break;
- default:
- msg = "unknown (invalid error number)";
- break;
- }
- fprintf (stderr, " Error message: %s\n", msg);
- fflush (stderr);
-
- vlc_restorecancel (canc);
- abort ();
-}
-
-# define VLC_THREAD_ASSERT( action ) \
- if (unlikely(val)) \
- vlc_thread_fatal (action, val, __func__, __FILE__, __LINE__)
-#else
-# define VLC_THREAD_ASSERT( action ) ((void)val)
-#endif
-
-void vlc_rwlock_init (vlc_rwlock_t *lock)
-{
- if (unlikely(pthread_rwlock_init (lock, NULL)))
- abort ();
-}
-
-void vlc_rwlock_destroy (vlc_rwlock_t *lock)
-{
- int val = pthread_rwlock_destroy (lock);
- VLC_THREAD_ASSERT ("destroying R/W lock");
-}
-
-void vlc_rwlock_rdlock (vlc_rwlock_t *lock)
-{
- int val = pthread_rwlock_rdlock (lock);
- VLC_THREAD_ASSERT ("acquiring R/W lock for reading");
-}
-
-void vlc_rwlock_wrlock (vlc_rwlock_t *lock)
-{
- int val = pthread_rwlock_wrlock (lock);
- VLC_THREAD_ASSERT ("acquiring R/W lock for writing");
-}
-
-void vlc_rwlock_unlock (vlc_rwlock_t *lock)
-{
- int val = pthread_rwlock_unlock (lock);
- VLC_THREAD_ASSERT ("releasing R/W lock");
-}
-
-void vlc_once(vlc_once_t *once, void (*cb)(void))
-{
- int val = pthread_once(once, cb);
- VLC_THREAD_ASSERT("initializing once");
-}
-
-int vlc_threadvar_create (vlc_threadvar_t *key, void (*destr) (void *))
-{
- return pthread_key_create (key, destr);
-}
-
-void vlc_threadvar_delete (vlc_threadvar_t *p_tls)
-{
- pthread_key_delete (*p_tls);
-}
-
-int vlc_threadvar_set (vlc_threadvar_t key, void *value)
-{
- return pthread_setspecific (key, value);
-}
-
-void *vlc_threadvar_get (vlc_threadvar_t key)
-{
- return pthread_getspecific (key);
-}
-
-void vlc_threads_setup (libvlc_int_t *p_libvlc)
-{
- (void) p_libvlc;
-}
-
-static int vlc_clone_attr (vlc_thread_t *th, pthread_attr_t *attr,
- void *(*entry) (void *), void *data, int priority)
-{
- int ret;
-
- sigset_t oldset;
- {
- sigset_t set;
- sigemptyset (&set);
- sigdelset (&set, SIGHUP);
- sigaddset (&set, SIGINT);
- sigaddset (&set, SIGQUIT);
- sigaddset (&set, SIGTERM);
-
- sigaddset (&set, SIGPIPE); /* We don't want this one, really! */
- pthread_sigmask (SIG_BLOCK, &set, &oldset);
- }
-
- (void) priority;
-
-#define VLC_STACKSIZE (128 * sizeof (void *) * 1024)
-
-#ifdef VLC_STACKSIZE
- ret = pthread_attr_setstacksize (attr, VLC_STACKSIZE);
- assert (ret == 0); /* fails iif VLC_STACKSIZE is invalid */
-#endif
-
- ret = pthread_create (th, attr, entry, data);
- pthread_sigmask (SIG_SETMASK, &oldset, NULL);
- pthread_attr_destroy (attr);
- return ret;
-}
-
-int vlc_clone (vlc_thread_t *th, void *(*entry) (void *), void *data,
- int priority)
-{
- pthread_attr_t attr;
-
- pthread_attr_init (&attr);
- return vlc_clone_attr (th, &attr, entry, data, priority);
-}
-
-void vlc_join (vlc_thread_t handle, void **result)
-{
- int val = pthread_join (handle, result);
- VLC_THREAD_ASSERT ("joining thread");
-}
-
-int vlc_clone_detach (vlc_thread_t *th, void *(*entry) (void *), void *data,
- int priority)
-{
- vlc_thread_t dummy;
- pthread_attr_t attr;
-
- if (th == NULL)
- th = &dummy;
-
- pthread_attr_init (&attr);
- pthread_attr_setdetachstate (&attr, PTHREAD_CREATE_DETACHED);
- return vlc_clone_attr (th, &attr, entry, data, priority);
-}
-
-unsigned long vlc_thread_id (void)
-{
- return -1;
-}
-
-int vlc_set_priority (vlc_thread_t th, int priority)
-{
- (void) th; (void) priority;
- return VLC_SUCCESS;
-}
-
-void vlc_cancel (vlc_thread_t thread_id)
-{
- pthread_cancel (thread_id);
-}
-
-int vlc_savecancel (void)
-{
- int state;
- int val = pthread_setcancelstate (PTHREAD_CANCEL_DISABLE, &state);
-
- VLC_THREAD_ASSERT ("saving cancellation");
- return state;
-}
-
-void vlc_restorecancel (int state)
-{
-#ifndef NDEBUG
- int oldstate, val;
-
- val = pthread_setcancelstate (state, &oldstate);
- VLC_THREAD_ASSERT ("restoring cancellation");
-
- if (unlikely(oldstate != PTHREAD_CANCEL_DISABLE))
- vlc_thread_fatal ("restoring cancellation while not disabled", EINVAL,
- __func__, __FILE__, __LINE__);
-#else
- pthread_setcancelstate (state, NULL);
-#endif
-}
-
-void vlc_testcancel (void)
-{
- pthread_testcancel ();
-}
-
-vlc_tick_t vlc_tick_now (void)
-{
- vlc_clock_setup();
- uint64_t date = mach_absolute_time();
-
- date = date * vlc_clock_conversion.quotient +
- date * vlc_clock_conversion.remainder / vlc_clock_conversion.divider;
- return VLC_TICK_FROM_NS(date);
-}
-
-#undef vlc_tick_wait
-void vlc_tick_wait (vlc_tick_t deadline)
-{
- deadline -= vlc_tick_now ();
- if (deadline > 0)
- vlc_tick_sleep (deadline);
-}
-
-#undef vlc_tick_sleep
-void vlc_tick_sleep (vlc_tick_t delay)
-{
- struct timespec ts = timespec_from_vlc_tick (delay);
-
- /* nanosleep uses mach_absolute_time and mach_wait_until internally,
- but also handles kernel errors. Thus we use just this. */
- while (nanosleep (&ts, &ts) == -1)
- assert (errno == EINTR);
-}
-
-unsigned vlc_GetCPUCount(void)
-{
- return sysconf(_SC_NPROCESSORS_CONF);
-}
--
2.24.1 (Apple Git-126)
More information about the vlc-devel
mailing list