From dba634132e8c03a612b5ba3fc6e6948b2c275f4e Mon Sep 17 00:00:00 2001 From: Jean-Baptiste Boric Date: Mon, 26 Dec 2016 21:45:27 +0100 Subject: [PATCH] mthread: add pthread spinlock emulation --- minix/include/minix/mthread.h | 10 ++++ minix/lib/libmthread/pthread_compat.c | 66 +++++++++++++++++++++++++++ 2 files changed, 76 insertions(+) diff --git a/minix/include/minix/mthread.h b/minix/include/minix/mthread.h index bb4ba56d6..9a159830b 100644 --- a/minix/include/minix/mthread.h +++ b/minix/include/minix/mthread.h @@ -154,6 +154,7 @@ typedef mthread_mutexattr_t pthread_mutexattr_t; typedef mthread_attr_t pthread_attr_t; typedef mthread_event_t pthread_event_t; typedef mthread_rwlock_t pthread_rwlock_t; +typedef mthread_mutex_t pthread_spinlock_t; /* emulate spinlocks with mutexes */ /* LSC: No equivalent, so void* for now. */ typedef void *pthread_rwlockattr_t; @@ -161,6 +162,8 @@ typedef void *pthread_rwlockattr_t; #define PTHREAD_ONCE_INIT 0 #define PTHREAD_MUTEX_INITIALIZER ((pthread_mutex_t) -1) #define PTHREAD_COND_INITIALIZER ((pthread_cond_t) -1) +#define PTHREAD_PROCESS_PRIVATE 0 +#define PTHREAD_PROCESS_SHARED 1 __BEGIN_DECLS /* allocate.c */ @@ -222,6 +225,13 @@ int pthread_rwlock_rdlock(pthread_rwlock_t *rwlock); int pthread_rwlock_wrlock(pthread_rwlock_t *rwlock); int pthread_rwlock_unlock(pthread_rwlock_t *rwlock); +/* pthread_compat.c */ +int pthread_spin_destroy(pthread_spinlock_t *lock); +int pthread_spin_init(pthread_spinlock_t *lock, int UNUSED(pshared)); +int pthread_spin_lock(pthread_spinlock_t *lock); +int pthread_spin_trylock(pthread_spinlock_t *lock); +int pthread_spin_unlock(pthread_spinlock_t *lock); + /* schedule.c */ int pthread_yield(void); int sched_yield(void); diff --git a/minix/lib/libmthread/pthread_compat.c b/minix/lib/libmthread/pthread_compat.c index 1a4b92e74..20b0a8f4f 100644 --- a/minix/lib/libmthread/pthread_compat.c +++ b/minix/lib/libmthread/pthread_compat.c @@ -139,6 +139,72 @@ int pthread_rwlock_init(pthread_rwlock_t *rwlock, pthread_rwlockattr_t *UNUSED(a return mthread_rwlock_init(rwlock); } +/*===========================================================================* + * pthread_spin_destroy * + *===========================================================================*/ +int pthread_spin_destroy(pthread_spinlock_t *lock) +{ + pthread_mutex_t *mutex = (pthread_mutex_t*)lock; + + if (PTHREAD_MUTEX_INITIALIZER == *mutex) { + mthread_mutex_init(mutex, NULL); + } + + return mthread_mutex_destroy(mutex); +} + +/*===========================================================================* + * pthread_spin_init * + *===========================================================================*/ +int pthread_spin_init(pthread_spinlock_t *lock, int UNUSED(pshared)) +{ + pthread_mutex_t *mutex = (pthread_mutex_t*)lock; + + return mthread_mutex_init(mutex, NULL); +} + +/*===========================================================================* + * pthread_spin_lock * + *===========================================================================*/ +int pthread_spin_lock(pthread_spinlock_t *lock) +{ + pthread_mutex_t *mutex = (pthread_mutex_t*)lock; + + if (PTHREAD_MUTEX_INITIALIZER == *mutex) { + mthread_mutex_init(mutex, NULL); + } + + return mthread_mutex_lock(mutex); +} + +/*===========================================================================* + * pthread_spin_trylock * + *===========================================================================*/ +int pthread_spin_trylock(pthread_spinlock_t *lock) +{ + pthread_mutex_t *mutex = (pthread_mutex_t*)lock; + + if (PTHREAD_MUTEX_INITIALIZER == *mutex) { + mthread_mutex_init(mutex, NULL); + } + + return mthread_mutex_trylock(mutex); +} + +/*===========================================================================* + * pthread_spin_unlock * + *===========================================================================*/ +int pthread_spin_unlock(pthread_spinlock_t *lock) +{ + pthread_mutex_t *mutex = (pthread_mutex_t*)lock; + + if (PTHREAD_MUTEX_INITIALIZER == *mutex) { + mthread_mutex_init(mutex, NULL); + } + + return mthread_mutex_unlock(mutex); +} + #if !defined(__weak_alias) #error __weak_alias is required to compile the pthread compat library #endif