diff options
-rw-r--r-- | lib/ovs-atomic-pthreads.c | 8 | ||||
-rw-r--r-- | lib/ovs-atomic-pthreads.h | 2 | ||||
-rw-r--r-- | lib/ovs-thread.c | 2 | ||||
-rw-r--r-- | lib/ovs-thread.h | 5 | ||||
-rw-r--r-- | tests/test-atomic.c | 12 |
5 files changed, 24 insertions, 5 deletions
diff --git a/lib/ovs-atomic-pthreads.c b/lib/ovs-atomic-pthreads.c index 7e7ef0508..a501b8256 100644 --- a/lib/ovs-atomic-pthreads.c +++ b/lib/ovs-atomic-pthreads.c @@ -26,10 +26,10 @@ atomic_flag_test_and_set(volatile atomic_flag *flag_) atomic_flag *flag = CONST_CAST(atomic_flag *, flag_); bool old_value; - ovs_mutex_lock(&flag->mutex); + xpthread_mutex_lock(&flag->mutex); old_value = flag->b; flag->b = true; - ovs_mutex_unlock(&flag->mutex); + xpthread_mutex_unlock(&flag->mutex); return old_value; } @@ -46,9 +46,9 @@ atomic_flag_clear(volatile atomic_flag *flag_) { atomic_flag *flag = CONST_CAST(atomic_flag *, flag_); - ovs_mutex_lock(&flag->mutex); + xpthread_mutex_lock(&flag->mutex); flag->b = false; - ovs_mutex_unlock(&flag->mutex); + xpthread_mutex_unlock(&flag->mutex); } void diff --git a/lib/ovs-atomic-pthreads.h b/lib/ovs-atomic-pthreads.h index 61a9771ac..2f47a9c97 100644 --- a/lib/ovs-atomic-pthreads.h +++ b/lib/ovs-atomic-pthreads.h @@ -144,7 +144,7 @@ atomic_signal_fence(memory_order order OVS_UNUSED) typedef struct { bool b; - struct ovs_mutex mutex; + pthread_mutex_t mutex; } atomic_flag; #define ATOMIC_FLAG_INIT { false, PTHREAD_MUTEX_INITIALIZER } diff --git a/lib/ovs-thread.c b/lib/ovs-thread.c index c8b2c1599..4d64b9284 100644 --- a/lib/ovs-thread.c +++ b/lib/ovs-thread.c @@ -114,6 +114,8 @@ UNLOCK_FUNCTION(rwlock, destroy); } \ } +XPTHREAD_FUNC1(pthread_mutex_lock, pthread_mutex_t *); +XPTHREAD_FUNC1(pthread_mutex_unlock, pthread_mutex_t *); XPTHREAD_FUNC1(pthread_mutexattr_init, pthread_mutexattr_t *); XPTHREAD_FUNC1(pthread_mutexattr_destroy, pthread_mutexattr_t *); XPTHREAD_FUNC2(pthread_mutexattr_settype, pthread_mutexattr_t *, int); diff --git a/lib/ovs-thread.h b/lib/ovs-thread.h index f5e171ac6..9b8eeef37 100644 --- a/lib/ovs-thread.h +++ b/lib/ovs-thread.h @@ -84,6 +84,11 @@ int ovs_mutex_trylock_at(const struct ovs_mutex *mutex, const char *where) void ovs_mutex_cond_wait(pthread_cond_t *, const struct ovs_mutex *); +/* Wrappers for pthread_mutex_*() that abort the process on any error. + * This is still needed when ovs-atomic-pthreads.h is used. */ +void xpthread_mutex_lock(pthread_mutex_t *mutex); +void xpthread_mutex_unlock(pthread_mutex_t *mutex); + /* Wrappers for pthread_mutexattr_*() that abort the process on any error. */ void xpthread_mutexattr_init(pthread_mutexattr_t *); void xpthread_mutexattr_destroy(pthread_mutexattr_t *); diff --git a/tests/test-atomic.c b/tests/test-atomic.c index 27bf5520e..e9bd6bda0 100644 --- a/tests/test-atomic.c +++ b/tests/test-atomic.c @@ -61,6 +61,16 @@ ovs_assert(value == 8); \ } +static void +test_atomic_flag(void) +{ + atomic_flag flag = ATOMIC_FLAG_INIT; + ovs_assert(atomic_flag_test_and_set(&flag) == false); + ovs_assert(flag.b == true); + atomic_flag_clear(&flag); + ovs_assert(flag.b == false); +} + int main(void) { @@ -90,5 +100,7 @@ main(void) TEST_ATOMIC_TYPE(atomic_uint64_t, uint64_t); TEST_ATOMIC_TYPE(atomic_int64_t, int64_t); + test_atomic_flag(); + return 0; } |