From: José Fonseca Date: Fri, 26 Apr 2013 07:03:33 +0000 (+0100) Subject: gallium: Use C11 thread abstractions. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=fd33a6bcd7f12;p=mesa.git gallium: Use C11 thread abstractions. Note that PIPE_ROUTINE now returns an int. Reviewed-by: Brian Paul Reviewed-by: Chad Versace --- 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 /* POSIX threads headers */ -#include /* for perror() */ +#ifdef HAVE_PTHREAD #include +#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 - -/* 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 } diff --git a/src/gallium/drivers/llvmpipe/lp_rast.c b/src/gallium/drivers/llvmpipe/lp_rast.c index 6ee849b64ad..0ae5976eedc 100644 --- a/src/gallium/drivers/llvmpipe/lp_rast.c +++ b/src/gallium/drivers/llvmpipe/lp_rast.c @@ -858,7 +858,7 @@ static PIPE_THREAD_ROUTINE( thread_function, init_data ) pipe_semaphore_signal(&task->work_done); } - return NULL; + return 0; } diff --git a/src/gallium/drivers/rbug/rbug_core.c b/src/gallium/drivers/rbug/rbug_core.c index 8f9388ad829..c5b26b85085 100644 --- a/src/gallium/drivers/rbug/rbug_core.c +++ b/src/gallium/drivers/rbug/rbug_core.c @@ -810,7 +810,7 @@ PIPE_THREAD_ROUTINE(rbug_thread, void_tr_rbug) if (s < 0) { debug_printf("rbug_rbug - failed to listen\n"); - return NULL; + return 0; } u_socket_block(s, false); @@ -836,7 +836,7 @@ PIPE_THREAD_ROUTINE(rbug_thread, void_tr_rbug) u_socket_stop(); - return NULL; + return 0; } /********************************************************** diff --git a/src/gallium/tests/unit/pipe_barrier_test.c b/src/gallium/tests/unit/pipe_barrier_test.c index f5d72b0abae..bab6acadb80 100644 --- a/src/gallium/tests/unit/pipe_barrier_test.c +++ b/src/gallium/tests/unit/pipe_barrier_test.c @@ -57,7 +57,7 @@ static PIPE_THREAD_ROUTINE(thread_function, thread_data) pipe_barrier_wait(&barrier); printf("thread %d exiting\n", thread_id); - return NULL; + return 0; } diff --git a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c index dc9d183ae6a..427ee7df642 100644 --- a/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c +++ b/src/gallium/winsys/radeon/drm/radeon_drm_winsys.c @@ -593,7 +593,7 @@ static PIPE_THREAD_ROUTINE(radeon_drm_cs_emit_ioctl, param) } ws->ncs = 0; pipe_mutex_unlock(ws->cs_stack_lock); - return NULL; + return 0; } DEBUG_GET_ONCE_BOOL_OPTION(thread, "RADEON_THREAD", TRUE)