[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