Most of the mtx_t uses in mesa only use lock/unlock, but a couple of places we use a condition variable and a recursive mutex. This patch introduces a new full_mtx_t for the cases where we need a more featureful mutex and changes mtx_t to only support lock/unlock.
Signed-off-by: Kristian Høgsberg <k...@bitplanet.net> --- include/c11/threads_posix.h | 51 ++++++++++++++++++++++++++++-------- include/c11/threads_win32.h | 48 ++++++++++++++++++++++++++------- src/gallium/auxiliary/os/os_thread.h | 10 +++---- src/mesa/main/mtypes.h | 2 +- src/mesa/main/shared.c | 4 +-- src/mesa/main/texobj.c | 4 +-- src/mesa/main/texobj.h | 4 +-- 7 files changed, 91 insertions(+), 32 deletions(-) diff --git a/include/c11/threads_posix.h b/include/c11/threads_posix.h index f9c165d..5119773 100644 --- a/include/c11/threads_posix.h +++ b/include/c11/threads_posix.h @@ -59,13 +59,14 @@ Configuration macro: #endif // FIXME: temporary non-standard hack to ease transition +#define _FULL_MTX_INITIALIZER_NP PTHREAD_MUTEX_INITIALIZER #define _MTX_INITIALIZER_NP PTHREAD_MUTEX_INITIALIZER /*---------------------------- types ----------------------------*/ typedef pthread_cond_t cnd_t; typedef pthread_t thrd_t; typedef pthread_key_t tss_t; -typedef pthread_mutex_t mtx_t; +typedef pthread_mutex_t full_mtx_t; typedef pthread_once_t once_flag; @@ -135,7 +136,7 @@ cnd_signal(cnd_t *cond) // 7.25.3.5 static inline int -cnd_timedwait(cnd_t *cond, mtx_t *mtx, const xtime *xt) +cnd_timedwait(cnd_t *cond, full_mtx_t *mtx, const xtime *xt) { struct timespec abs_time; int rt; @@ -148,7 +149,7 @@ cnd_timedwait(cnd_t *cond, mtx_t *mtx, const xtime *xt) // 7.25.3.6 static inline int -cnd_wait(cnd_t *cond, mtx_t *mtx) +cnd_wait(cnd_t *cond, full_mtx_t *mtx) { if (!cond || !mtx) return thrd_error; pthread_cond_wait(cond, mtx); @@ -159,7 +160,7 @@ cnd_wait(cnd_t *cond, mtx_t *mtx) /*-------------------- 7.25.4 Mutex functions --------------------*/ // 7.25.4.1 static inline void -mtx_destroy(mtx_t *mtx) +full_mtx_destroy(full_mtx_t *mtx) { assert(mtx); pthread_mutex_destroy(mtx); @@ -167,7 +168,7 @@ mtx_destroy(mtx_t *mtx) // 7.25.4.2 static inline int -mtx_init(mtx_t *mtx, int type) +full_mtx_init(full_mtx_t *mtx, int type) { pthread_mutexattr_t attr; if (!mtx) return thrd_error; @@ -191,7 +192,7 @@ mtx_init(mtx_t *mtx, int type) // 7.25.4.3 static inline int -mtx_lock(mtx_t *mtx) +full_mtx_lock(full_mtx_t *mtx) { if (!mtx) return thrd_error; pthread_mutex_lock(mtx); @@ -199,14 +200,14 @@ mtx_lock(mtx_t *mtx) } static inline int -mtx_trylock(mtx_t *mtx); +full_mtx_trylock(full_mtx_t *mtx); static inline void thrd_yield(void); // 7.25.4.4 static inline int -mtx_timedlock(mtx_t *mtx, const xtime *xt) +full_mtx_timedlock(full_mtx_t *mtx, const xtime *xt) { if (!mtx || !xt) return thrd_error; { @@ -222,7 +223,7 @@ mtx_timedlock(mtx_t *mtx, const xtime *xt) #else time_t expire = time(NULL); expire += xt->sec; - while (mtx_trylock(mtx) != thrd_success) { + while (full_mtx_trylock(mtx) != thrd_success) { time_t now = time(NULL); if (expire < now) return thrd_busy; @@ -236,7 +237,7 @@ mtx_timedlock(mtx_t *mtx, const xtime *xt) // 7.25.4.5 static inline int -mtx_trylock(mtx_t *mtx) +full_mtx_trylock(full_mtx_t *mtx) { if (!mtx) return thrd_error; return (pthread_mutex_trylock(mtx) == 0) ? thrd_success : thrd_busy; @@ -244,13 +245,41 @@ mtx_trylock(mtx_t *mtx) // 7.25.4.6 static inline int -mtx_unlock(mtx_t *mtx) +full_mtx_unlock(full_mtx_t *mtx) { if (!mtx) return thrd_error; pthread_mutex_unlock(mtx); return thrd_success; } +typedef full_mtx_t mtx_t; + +static inline void +mtx_init(mtx_t *mtx, int type) +{ + assert(type == mtx_plain); + + full_mtx_init(mtx, mtx_plain); +} + +static inline void +mtx_destroy(mtx_t *mtx) +{ + full_mtx_destroy(mtx); +} + +static inline void +mtx_lock(mtx_t *mtx) +{ + full_mtx_lock(mtx); +} + +static inline void +mtx_unlock(mtx_t *mtx) +{ + full_mtx_unlock(mtx); +} + /*------------------- 7.25.5 Thread functions -------------------*/ // 7.25.5.1 diff --git a/include/c11/threads_win32.h b/include/c11/threads_win32.h index d017c31..6968ce4 100644 --- a/include/c11/threads_win32.h +++ b/include/c11/threads_win32.h @@ -85,6 +85,7 @@ Configuration macro: #define TSS_DTOR_ITERATIONS 1 // FIXME: temporary non-standard hack to ease transition +#define _FULL_MTX_INITIALIZER_NP {(PCRITICAL_SECTION_DEBUG)-1, -1, 0, 0, 0, 0} #define _MTX_INITIALIZER_NP {(PCRITICAL_SECTION_DEBUG)-1, -1, 0, 0, 0, 0} /*---------------------------- types ----------------------------*/ @@ -206,7 +207,7 @@ static void impl_cond_do_signal(cnd_t *cond, int broadcast) ReleaseSemaphore(cond->sem_queue, nsignal, NULL); } -static int impl_cond_do_wait(cnd_t *cond, mtx_t *mtx, const xtime *xt) +static int impl_cond_do_wait(cnd_t *cond, full_mtx_t *mtx, const xtime *xt) { int nleft = 0; int ngone = 0; @@ -378,7 +379,7 @@ cnd_signal(cnd_t *cond) // 7.25.3.5 static inline int -cnd_timedwait(cnd_t *cond, mtx_t *mtx, const xtime *xt) +cnd_timedwait(cnd_t *cond, full_mtx_t *mtx, const xtime *xt) { if (!cond || !mtx || !xt) return thrd_error; #ifdef EMULATED_THREADS_USE_NATIVE_CV @@ -392,7 +393,7 @@ cnd_timedwait(cnd_t *cond, mtx_t *mtx, const xtime *xt) // 7.25.3.6 static inline int -cnd_wait(cnd_t *cond, mtx_t *mtx) +cnd_wait(cnd_t *cond, full_mtx_t *mtx) { if (!cond || !mtx) return thrd_error; #ifdef EMULATED_THREADS_USE_NATIVE_CV @@ -407,7 +408,7 @@ cnd_wait(cnd_t *cond, mtx_t *mtx) /*-------------------- 7.25.4 Mutex functions --------------------*/ // 7.25.4.1 static inline void -mtx_destroy(mtx_t *mtx) +full_mtx_destroy(full_mtx_t *mtx) { assert(mtx); DeleteCriticalSection(mtx); @@ -415,7 +416,7 @@ mtx_destroy(mtx_t *mtx) // 7.25.4.2 static inline int -mtx_init(mtx_t *mtx, int type) +full_mtx_init(full_mtx_t *mtx, int type) { if (!mtx) return thrd_error; if (type != mtx_plain && type != mtx_timed && type != mtx_try @@ -429,7 +430,7 @@ mtx_init(mtx_t *mtx, int type) // 7.25.4.3 static inline int -mtx_lock(mtx_t *mtx) +full_mtx_lock(full_mtx_t *mtx) { if (!mtx) return thrd_error; EnterCriticalSection(mtx); @@ -438,7 +439,7 @@ mtx_lock(mtx_t *mtx) // 7.25.4.4 static inline int -mtx_timedlock(mtx_t *mtx, const xtime *xt) +full_mtx_timedlock(full_mtx_t *mtx, const xtime *xt) { time_t expire, now; if (!mtx || !xt) return thrd_error; @@ -456,7 +457,7 @@ mtx_timedlock(mtx_t *mtx, const xtime *xt) // 7.25.4.5 static inline int -mtx_trylock(mtx_t *mtx) +full_mtx_trylock(full_mtx_t *mtx) { if (!mtx) return thrd_error; return TryEnterCriticalSection(mtx) ? thrd_success : thrd_busy; @@ -464,7 +465,7 @@ mtx_trylock(mtx_t *mtx) // 7.25.4.6 static inline int -mtx_unlock(mtx_t *mtx) +full_mtx_unlock(full_mtx_t *mtx) { if (!mtx) return thrd_error; LeaveCriticalSection(mtx); @@ -472,6 +473,35 @@ mtx_unlock(mtx_t *mtx) } +typedef full_mtx_t mtx_t; + +static inline void +mtx_init(mtx_t *mtx, int type) +{ + assert(type == mtx_plain); + + full_mtx_init(mtx, mtx_plain); +} + +static inline void +mtx_destroy(mtx_t *mtx) +{ + full_mtx_destroy(mtx); +} + +static inline void +mtx_lock(mtx_t *mtx) +{ + full_mtx_lock(mtx); +} + +static inline void +mtx_unlock(mtx_t *mtx) +{ + full_mtx_unlock(mtx); +} + + /*------------------- 7.25.5 Thread functions -------------------*/ // 7.25.5.1 static inline int diff --git a/src/gallium/auxiliary/os/os_thread.h b/src/gallium/auxiliary/os/os_thread.h index ff46a89..4acda4b 100644 --- a/src/gallium/auxiliary/os/os_thread.h +++ b/src/gallium/auxiliary/os/os_thread.h @@ -88,22 +88,22 @@ static INLINE int pipe_thread_destroy( pipe_thread thread ) /* pipe_mutex */ -typedef mtx_t pipe_mutex; +typedef full_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) + (void) full_mtx_init(&(mutex), mtx_plain) #define pipe_mutex_destroy(mutex) \ - mtx_destroy(&(mutex)) + full_mtx_destroy(&(mutex)) #define pipe_mutex_lock(mutex) \ - (void) mtx_lock(&(mutex)) + (void) full_mtx_lock(&(mutex)) #define pipe_mutex_unlock(mutex) \ - (void) mtx_unlock(&(mutex)) + (void) full_mtx_unlock(&(mutex)) /* pipe_condvar diff --git a/src/mesa/main/mtypes.h b/src/mesa/main/mtypes.h index 4c83379..a030f92 100644 --- a/src/mesa/main/mtypes.h +++ b/src/mesa/main/mtypes.h @@ -3112,7 +3112,7 @@ struct gl_shared_state * \todo Improve the granularity of locking. */ /*@{*/ - mtx_t TexMutex; /**< texobj thread safety */ + full_mtx_t TexMutex; /**< texobj thread safety */ GLuint TextureStateStamp; /**< state notification for shared tex */ /*@}*/ diff --git a/src/mesa/main/shared.c b/src/mesa/main/shared.c index ccf5355..bac8401 100644 --- a/src/mesa/main/shared.c +++ b/src/mesa/main/shared.c @@ -113,7 +113,7 @@ _mesa_alloc_shared_state(struct gl_context *ctx) assert(shared->DefaultTex[TEXTURE_1D_INDEX]->RefCount == 1); /* Mutex and timestamp for texobj state validation */ - mtx_init(&shared->TexMutex, mtx_recursive); + full_mtx_init(&shared->TexMutex, mtx_recursive); shared->TextureStateStamp = 0; shared->FrameBuffers = _mesa_NewHashTable(); @@ -357,7 +357,7 @@ free_shared_state(struct gl_context *ctx, struct gl_shared_state *shared) _mesa_DeleteHashTable(shared->TexObjects); mtx_destroy(&shared->Mutex); - mtx_destroy(&shared->TexMutex); + full_mtx_destroy(&shared->TexMutex); free(shared); } diff --git a/src/mesa/main/texobj.c b/src/mesa/main/texobj.c index a99dd7a..10da9bc 100644 --- a/src/mesa/main/texobj.c +++ b/src/mesa/main/texobj.c @@ -2026,7 +2026,7 @@ _mesa_IsTexture( GLuint texture ) void _mesa_lock_context_textures( struct gl_context *ctx ) { - mtx_lock(&ctx->Shared->TexMutex); + full_mtx_lock(&ctx->Shared->TexMutex); if (ctx->Shared->TextureStateStamp != ctx->TextureStateTimestamp) { ctx->NewState |= _NEW_TEXTURE; @@ -2039,7 +2039,7 @@ void _mesa_unlock_context_textures( struct gl_context *ctx ) { assert(ctx->Shared->TextureStateStamp == ctx->TextureStateTimestamp); - mtx_unlock(&ctx->Shared->TexMutex); + full_mtx_unlock(&ctx->Shared->TexMutex); } diff --git a/src/mesa/main/texobj.h b/src/mesa/main/texobj.h index ec5ccb2..1319565 100644 --- a/src/mesa/main/texobj.h +++ b/src/mesa/main/texobj.h @@ -107,7 +107,7 @@ _mesa_reference_texobj(struct gl_texture_object **ptr, static inline void _mesa_lock_texture(struct gl_context *ctx, struct gl_texture_object *texObj) { - mtx_lock(&ctx->Shared->TexMutex); + full_mtx_lock(&ctx->Shared->TexMutex); ctx->Shared->TextureStateStamp++; (void) texObj; } @@ -116,7 +116,7 @@ static inline void _mesa_unlock_texture(struct gl_context *ctx, struct gl_texture_object *texObj) { (void) texObj; - mtx_unlock(&ctx->Shared->TexMutex); + full_mtx_unlock(&ctx->Shared->TexMutex); } -- 2.2.2 _______________________________________________ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev