diff options
author | José Fonseca <[email protected]> | 2013-04-26 08:03:33 +0100 |
---|---|---|
committer | José Fonseca <[email protected]> | 2014-01-23 12:55:55 +0000 |
commit | fd33a6bcd7f1271e80332379131e82e00fe10586 (patch) | |
tree | efbc6599750e2a89fe86124f077b84807ac5d9f3 /src/gallium/auxiliary/os/os_thread.h | |
parent | ecaa81bd9648131e01f9ad4fd9d185370df8e872 (diff) |
gallium: Use C11 thread abstractions.
Note that PIPE_ROUTINE now returns an int.
Reviewed-by: Brian Paul <[email protected]>
Reviewed-by: Chad Versace <[email protected]>
Diffstat (limited to 'src/gallium/auxiliary/os/os_thread.h')
-rw-r--r-- | src/gallium/auxiliary/os/os_thread.h | 262 |
1 files changed, 32 insertions, 230 deletions
diff --git a/src/gallium/auxiliary/os/os_thread.h b/src/gallium/auxiliary/os/os_thread.h index b7b98b73e3d..1d802d23d17 100644 --- a/src/gallium/auxiliary/os/os_thread.h +++ b/src/gallium/auxiliary/os/os_thread.h @@ -40,271 +40,97 @@ #include "pipe/p_compiler.h" #include "util/u_debug.h" /* for assert */ +#include "c11/threads.h" -#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS) || defined(PIPE_OS_APPLE) || defined(PIPE_OS_HAIKU) || defined(PIPE_OS_CYGWIN) || defined(PIPE_OS_HURD) - -#include <pthread.h> /* POSIX threads headers */ -#include <stdio.h> /* for perror() */ +#ifdef HAVE_PTHREAD #include <signal.h> +#endif /* pipe_thread */ -typedef pthread_t pipe_thread; +typedef thrd_t pipe_thread; #define PIPE_THREAD_ROUTINE( name, param ) \ - void *name( void *param ) + int name( void *param ) -static INLINE pipe_thread pipe_thread_create( void *(* routine)( void *), void *param ) +static INLINE pipe_thread pipe_thread_create( PIPE_THREAD_ROUTINE((*routine), ), void *param ) { pipe_thread thread; +#ifdef HAVE_PTHREAD sigset_t saved_set, new_set; int ret; sigfillset(&new_set); pthread_sigmask(SIG_SETMASK, &new_set, &saved_set); - ret = pthread_create( &thread, NULL, routine, param ); + ret = thrd_create( &thread, routine, param ); pthread_sigmask(SIG_SETMASK, &saved_set, NULL); +#else + int ret; + ret = thrd_create( &thread, routine, param ); +#endif if (ret) return 0; + return thread; } static INLINE int pipe_thread_wait( pipe_thread thread ) { - return pthread_join( thread, NULL ); + return thrd_join( thread, NULL ); } static INLINE int pipe_thread_destroy( pipe_thread thread ) { - return pthread_detach( thread ); + return thrd_detach( thread ); } /* pipe_mutex */ -typedef pthread_mutex_t pipe_mutex; +typedef mtx_t pipe_mutex; #define pipe_static_mutex(mutex) \ - static pipe_mutex mutex = PTHREAD_MUTEX_INITIALIZER + static pipe_mutex mutex = _MTX_INITIALIZER_NP #define pipe_mutex_init(mutex) \ - (void) pthread_mutex_init(&(mutex), NULL) + (void) mtx_init(&(mutex), mtx_plain) #define pipe_mutex_destroy(mutex) \ - pthread_mutex_destroy(&(mutex)) + mtx_destroy(&(mutex)) #define pipe_mutex_lock(mutex) \ - (void) pthread_mutex_lock(&(mutex)) + (void) mtx_lock(&(mutex)) #define pipe_mutex_unlock(mutex) \ - (void) pthread_mutex_unlock(&(mutex)) + (void) mtx_unlock(&(mutex)) /* pipe_condvar */ -typedef pthread_cond_t pipe_condvar; +typedef cnd_t pipe_condvar; #define pipe_condvar_init(cond) \ - pthread_cond_init(&(cond), NULL) - -#define pipe_condvar_destroy(cond) \ - pthread_cond_destroy(&(cond)) - -#define pipe_condvar_wait(cond, mutex) \ - pthread_cond_wait(&(cond), &(mutex)) - -#define pipe_condvar_signal(cond) \ - pthread_cond_signal(&(cond)) - -#define pipe_condvar_broadcast(cond) \ - pthread_cond_broadcast(&(cond)) - - - -#elif defined(PIPE_SUBSYSTEM_WINDOWS_USER) - -#include <windows.h> - -/* pipe_thread - */ -typedef HANDLE pipe_thread; - -#define PIPE_THREAD_ROUTINE( name, param ) \ - void * WINAPI name( void *param ) - -static INLINE pipe_thread pipe_thread_create( void *(WINAPI * routine)( void *), void *param ) -{ - DWORD id; - return CreateThread( NULL, 0, (LPTHREAD_START_ROUTINE) routine, param, 0, &id ); -} - -static INLINE int pipe_thread_wait( pipe_thread thread ) -{ - if (WaitForSingleObject( thread, INFINITE ) == WAIT_OBJECT_0) - return 0; - return -1; -} - -static INLINE int pipe_thread_destroy( pipe_thread thread ) -{ - if (CloseHandle( thread )) - return 0; - return -1; -} - - -/* pipe_mutex - */ -typedef CRITICAL_SECTION pipe_mutex; - -/* http://locklessinc.com/articles/pthreads_on_windows/ */ -#define pipe_static_mutex(mutex) \ - static pipe_mutex mutex = {(PCRITICAL_SECTION_DEBUG)-1, -1, 0, 0, 0, 0} - -#define pipe_mutex_init(mutex) \ - InitializeCriticalSection(&mutex) - -#define pipe_mutex_destroy(mutex) \ - DeleteCriticalSection(&mutex) - -#define pipe_mutex_lock(mutex) \ - EnterCriticalSection(&mutex) - -#define pipe_mutex_unlock(mutex) \ - LeaveCriticalSection(&mutex) - -/* TODO: Need a macro to declare "I don't care about WinXP compatibilty" */ -#if 0 && defined (_WIN32_WINNT) && (_WIN32_WINNT >= 0x0600) -/* CONDITION_VARIABLE is only available on newer versions of Windows - * (Server 2008/Vista or later). - * http://msdn.microsoft.com/en-us/library/ms682052(VS.85).aspx - * - * pipe_condvar - */ -typedef CONDITION_VARIABLE pipe_condvar; - -#define pipe_condvar_init(cond) \ - InitializeConditionVariable(&(cond)) - -#define pipe_condvar_destroy(cond) \ - (void) cond /* nothing to do */ - -#define pipe_condvar_wait(cond, mutex) \ - SleepConditionVariableCS(&(cond), &(mutex), INFINITE) - -#define pipe_condvar_signal(cond) \ - WakeConditionVariable(&(cond)) - -#define pipe_condvar_broadcast(cond) \ - WakeAllConditionVariable(&(cond)) - -#else /* need compatibility with pre-Vista Win32 */ - -/* pipe_condvar (XXX FIX THIS) - * See http://www.cs.wustl.edu/~schmidt/win32-cv-1.html - * for potential pitfalls in implementation. - */ -typedef DWORD pipe_condvar; - -#define pipe_condvar_init(cond) \ - (void) (cond = 1) + cnd_init(&(cond)) #define pipe_condvar_destroy(cond) \ - (void) cond + cnd_destroy(&(cond)) -/* Poor man's pthread_cond_wait(): - Just release the mutex and sleep for one millisecond. - The caller's while() loop does all the work. */ #define pipe_condvar_wait(cond, mutex) \ - do { pipe_mutex_unlock(mutex); \ - Sleep(cond); \ - pipe_mutex_lock(mutex); \ - } while (0) + cnd_wait(&(cond), &(mutex)) #define pipe_condvar_signal(cond) \ - (void) cond + cnd_signal(&(cond)) #define pipe_condvar_broadcast(cond) \ - (void) cond - -#endif /* pre-Vista win32 */ - -#else - -#include "os/os_time.h" - -/** Dummy definitions */ - -typedef unsigned pipe_thread; - -#define PIPE_THREAD_ROUTINE( name, param ) \ - void * name( void *param ) - -static INLINE pipe_thread pipe_thread_create( void *(* routine)( void *), void *param ) -{ - return 0; -} - -static INLINE int pipe_thread_wait( pipe_thread thread ) -{ - return -1; -} - -static INLINE int pipe_thread_destroy( pipe_thread thread ) -{ - return -1; -} - -typedef unsigned pipe_mutex; - -#define pipe_static_mutex(mutex) \ - static pipe_mutex mutex = 0 - -#define pipe_mutex_init(mutex) \ - (void) mutex - -#define pipe_mutex_destroy(mutex) \ - (void) mutex - -#define pipe_mutex_lock(mutex) \ - (void) mutex - -#define pipe_mutex_unlock(mutex) \ - (void) mutex - -typedef int64_t pipe_condvar; - -#define pipe_condvar_init(condvar) \ - (void) (condvar = 1000) - -#define pipe_condvar_destroy(condvar) \ - (void) condvar - -/* Poor man's pthread_cond_wait(): - Just release the mutex and sleep for one millisecond. - The caller's while() loop does all the work. */ -#define pipe_condvar_wait(condvar, mutex) \ - do { pipe_mutex_unlock(mutex); \ - os_time_sleep(condvar); \ - pipe_mutex_lock(mutex); \ - } while (0) - -#define pipe_condvar_signal(condvar) \ - (void) condvar - -#define pipe_condvar_broadcast(condvar) \ - (void) condvar - - -#endif /* PIPE_OS_? */ + cnd_broadcast(&(cond)) /* * pipe_barrier */ -#if (defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS) || defined(PIPE_OS_HURD)) && !defined(PIPE_OS_ANDROID) +#if defined(HAVE_PTHREAD) && !defined(PIPE_OS_ANDROID) typedef pthread_barrier_t pipe_barrier; @@ -432,11 +258,7 @@ pipe_semaphore_wait(pipe_semaphore *sema) */ typedef struct { -#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS) || defined(PIPE_OS_APPLE) || defined(PIPE_OS_HAIKU) || defined(PIPE_OS_CYGWIN) || defined(PIPE_OS_HURD) - pthread_key_t key; -#elif defined(PIPE_SUBSYSTEM_WINDOWS_USER) - DWORD key; -#endif + tss_t key; int initMagic; } pipe_tsd; @@ -447,14 +269,9 @@ typedef struct { static INLINE void pipe_tsd_init(pipe_tsd *tsd) { -#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS) || defined(PIPE_OS_APPLE) || defined(PIPE_OS_HAIKU) || defined(PIPE_OS_CYGWIN) || defined(PIPE_OS_HURD) - if (pthread_key_create(&tsd->key, NULL/*free*/) != 0) { - perror("pthread_key_create(): failed to allocate key for thread specific data"); + if (tss_create(&tsd->key, NULL/*free*/) != 0) { exit(-1); } -#elif defined(PIPE_SUBSYSTEM_WINDOWS_USER) - assert(0); -#endif tsd->initMagic = PIPE_TSD_INIT_MAGIC; } @@ -464,15 +281,7 @@ pipe_tsd_get(pipe_tsd *tsd) if (tsd->initMagic != (int) PIPE_TSD_INIT_MAGIC) { pipe_tsd_init(tsd); } -#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS) || defined(PIPE_OS_APPLE) || defined(PIPE_OS_HAIKU) || defined(PIPE_OS_CYGWIN) || defined(PIPE_OS_HURD) - return pthread_getspecific(tsd->key); -#elif defined(PIPE_SUBSYSTEM_WINDOWS_USER) - assert(0); - return NULL; -#else - assert(0); - return NULL; -#endif + return tss_get(tsd->key); } static INLINE void @@ -481,16 +290,9 @@ pipe_tsd_set(pipe_tsd *tsd, void *value) if (tsd->initMagic != (int) PIPE_TSD_INIT_MAGIC) { pipe_tsd_init(tsd); } -#if defined(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS) || defined(PIPE_OS_APPLE) || defined(PIPE_OS_HAIKU) || defined(PIPE_OS_CYGWIN) || defined(PIPE_OS_HURD) - if (pthread_setspecific(tsd->key, value) != 0) { - perror("pthread_set_specific() failed"); + if (tss_set(tsd->key, value) != 0) { exit(-1); } -#elif defined(PIPE_SUBSYSTEM_WINDOWS_USER) - assert(0); -#else - assert(0); -#endif } |