diff options
author | Jonathan Gray <jsg@cvs.openbsd.org> | 2017-12-31 07:12:27 +0000 |
---|---|---|
committer | Jonathan Gray <jsg@cvs.openbsd.org> | 2017-12-31 07:12:27 +0000 |
commit | 051645c92924bf915d82bf219f2ed67309b5577a (patch) | |
tree | 4aae126dd8e5a18c6a9926a5468d1561e6038a07 /lib/mesa/src/gallium/auxiliary/os | |
parent | 2dae6fe6f74cf7fb9fd65285302c0331d9786b00 (diff) |
Merge Mesa 17.2.8
Diffstat (limited to 'lib/mesa/src/gallium/auxiliary/os')
-rw-r--r-- | lib/mesa/src/gallium/auxiliary/os/os_thread.h | 160 |
1 files changed, 41 insertions, 119 deletions
diff --git a/lib/mesa/src/gallium/auxiliary/os/os_thread.h b/lib/mesa/src/gallium/auxiliary/os/os_thread.h index ec8adbc75..10d4695da 100644 --- a/lib/mesa/src/gallium/auxiliary/os/os_thread.h +++ b/lib/mesa/src/gallium/auxiliary/os/os_thread.h @@ -39,92 +39,18 @@ #include "pipe/p_compiler.h" #include "util/u_debug.h" /* for assert */ +#include "util/u_thread.h" -#include "c11/threads.h" - -#ifdef HAVE_PTHREAD -#include <signal.h> -#endif - - -/* pipe_thread - */ -typedef thrd_t pipe_thread; - -#define PIPE_THREAD_ROUTINE( name, param ) \ - int name( 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 = 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 thrd_join( thread, NULL ); -} - -static inline int pipe_thread_destroy( pipe_thread thread ) -{ - return thrd_detach( thread ); -} - -static inline void pipe_thread_setname( const char *name ) -{ -#if defined(HAVE_PTHREAD) -# if defined(__GNU_LIBRARY__) && defined(__GLIBC__) && defined(__GLIBC_MINOR__) && \ - (__GLIBC__ >= 3 || (__GLIBC__ == 2 && __GLIBC_MINOR__ >= 12)) - pthread_setname_np(pthread_self(), name); -# endif -#endif - (void)name; -} - - -/* pipe_mutex - */ -typedef mtx_t pipe_mutex; - -#define pipe_static_mutex(mutex) \ - static pipe_mutex mutex = _MTX_INITIALIZER_NP - -#define pipe_mutex_init(mutex) \ - (void) mtx_init(&(mutex), mtx_plain) - -#define pipe_mutex_destroy(mutex) \ - mtx_destroy(&(mutex)) - -#define pipe_mutex_lock(mutex) \ - (void) mtx_lock(&(mutex)) - -#define pipe_mutex_unlock(mutex) \ - (void) mtx_unlock(&(mutex)) #define pipe_mutex_assert_locked(mutex) \ __pipe_mutex_assert_locked(&(mutex)) static inline void -__pipe_mutex_assert_locked(pipe_mutex *mutex) +__pipe_mutex_assert_locked(mtx_t *mutex) { #ifdef DEBUG /* NOTE: this would not work for recursive mutexes, but - * pipe_mutex doesn't support those + * mtx_t doesn't support those */ int ret = mtx_trylock(mutex); assert(ret == thrd_busy); @@ -133,31 +59,12 @@ __pipe_mutex_assert_locked(pipe_mutex *mutex) #endif } -/* pipe_condvar - */ -typedef cnd_t pipe_condvar; - -#define pipe_condvar_init(cond) \ - cnd_init(&(cond)) - -#define pipe_condvar_destroy(cond) \ - cnd_destroy(&(cond)) - -#define pipe_condvar_wait(cond, mutex) \ - cnd_wait(&(cond), &(mutex)) - -#define pipe_condvar_signal(cond) \ - cnd_signal(&(cond)) - -#define pipe_condvar_broadcast(cond) \ - 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(PIPE_OS_LINUX) || defined(PIPE_OS_BSD) || defined(PIPE_OS_SOLARIS) || defined(PIPE_OS_HURD)) && (!defined(PIPE_OS_ANDROID) || ANDROID_API_LEVEL >= 24) typedef pthread_barrier_t pipe_barrier; @@ -183,8 +90,8 @@ typedef struct { unsigned count; unsigned waiters; uint64_t sequence; - pipe_mutex mutex; - pipe_condvar condvar; + mtx_t mutex; + cnd_t condvar; } pipe_barrier; static inline void pipe_barrier_init(pipe_barrier *barrier, unsigned count) @@ -192,20 +99,20 @@ static inline void pipe_barrier_init(pipe_barrier *barrier, unsigned count) barrier->count = count; barrier->waiters = 0; barrier->sequence = 0; - pipe_mutex_init(barrier->mutex); - pipe_condvar_init(barrier->condvar); + (void) mtx_init(&barrier->mutex, mtx_plain); + cnd_init(&barrier->condvar); } static inline void pipe_barrier_destroy(pipe_barrier *barrier) { assert(barrier->waiters == 0); - pipe_mutex_destroy(barrier->mutex); - pipe_condvar_destroy(barrier->condvar); + mtx_destroy(&barrier->mutex); + cnd_destroy(&barrier->condvar); } static inline void pipe_barrier_wait(pipe_barrier *barrier) { - pipe_mutex_lock(barrier->mutex); + mtx_lock(&barrier->mutex); assert(barrier->waiters < barrier->count); barrier->waiters++; @@ -214,15 +121,15 @@ static inline void pipe_barrier_wait(pipe_barrier *barrier) uint64_t sequence = barrier->sequence; do { - pipe_condvar_wait(barrier->condvar, barrier->mutex); + cnd_wait(&barrier->condvar, &barrier->mutex); } while (sequence == barrier->sequence); } else { barrier->waiters = 0; barrier->sequence++; - pipe_condvar_broadcast(barrier->condvar); + cnd_broadcast(&barrier->condvar); } - pipe_mutex_unlock(barrier->mutex); + mtx_unlock(&barrier->mutex); } @@ -235,8 +142,8 @@ static inline void pipe_barrier_wait(pipe_barrier *barrier) typedef struct { - pipe_mutex mutex; - pipe_condvar cond; + mtx_t mutex; + cnd_t cond; int counter; } pipe_semaphore; @@ -244,38 +151,38 @@ typedef struct static inline void pipe_semaphore_init(pipe_semaphore *sema, int init_val) { - pipe_mutex_init(sema->mutex); - pipe_condvar_init(sema->cond); + (void) mtx_init(&sema->mutex, mtx_plain); + cnd_init(&sema->cond); sema->counter = init_val; } static inline void pipe_semaphore_destroy(pipe_semaphore *sema) { - pipe_mutex_destroy(sema->mutex); - pipe_condvar_destroy(sema->cond); + mtx_destroy(&sema->mutex); + cnd_destroy(&sema->cond); } /** Signal/increment semaphore counter */ static inline void pipe_semaphore_signal(pipe_semaphore *sema) { - pipe_mutex_lock(sema->mutex); + mtx_lock(&sema->mutex); sema->counter++; - pipe_condvar_signal(sema->cond); - pipe_mutex_unlock(sema->mutex); + cnd_signal(&sema->cond); + mtx_unlock(&sema->mutex); } /** Wait for semaphore counter to be greater than zero */ static inline void pipe_semaphore_wait(pipe_semaphore *sema) { - pipe_mutex_lock(sema->mutex); + mtx_lock(&sema->mutex); while (sema->counter <= 0) { - pipe_condvar_wait(sema->cond, sema->mutex); + cnd_wait(&sema->cond, &sema->mutex); } sema->counter--; - pipe_mutex_unlock(sema->mutex); + mtx_unlock(&sema->mutex); } @@ -324,4 +231,19 @@ pipe_tsd_set(pipe_tsd *tsd, void *value) +/* + * Thread statistics. + */ + +/* Return the time of the current thread's CPU time clock. */ +static inline int64_t +pipe_current_thread_get_time_nano(void) +{ +#if defined(HAVE_PTHREAD) + return u_thread_get_time_nano(pthread_self()); +#else + return 0; +#endif +} + #endif /* OS_THREAD_H_ */ |