From 13d94ee9c8c5e031a6fb46903802c56784c4d410 Mon Sep 17 00:00:00 2001 From: Alex Wang Date: Wed, 31 Jul 2013 16:09:11 -0700 Subject: [PATCH] ovs-atomic-pthreads: Fix "has incomplete type" error. Commit 97be153858b4cd175cbe7862b8e1624bf22ab98a (clang: Add annotations for thread safety check.) defined 'struct ovs_mutex' variable in 'atomic_flag' in 'ovs-atomic-pthreads.h'. This casued "mutex: has incomplete type" error in compilation when 'ovs-atomic-pthreads.h' is included. This commit goes back to use 'pthread_mutex_t' for that variable and adds test for the 'atomic_flag' related functions. Reported-by: Gurucharan Shetty Signed-off-by: Alex Wang Signed-off-by: Ben Pfaff --- lib/ovs-atomic-pthreads.c | 8 ++++---- lib/ovs-atomic-pthreads.h | 2 +- lib/ovs-thread.c | 2 ++ lib/ovs-thread.h | 5 +++++ 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; } -- 2.43.0