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 <[email protected]> Signed-off-by: Alex Wang <[email protected]> --- 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 | 10 ++++++++++ 5 files changed, 22 insertions(+), 5 deletions(-) diff --git a/lib/ovs-atomic-pthreads.c b/lib/ovs-atomic-pthreads.c index 7e7ef05..a501b82 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 61a9771..2f47a9c 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 c8b2c15..4d64b92 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 f5e171a..fe0e8d2 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) OVS_ACQUIRES(mutex); +void xpthread_mutex_unlock(pthread_mutex_t *mutex) OVS_RELEASES(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 27bf552..480c3cd 100644 --- a/tests/test-atomic.c +++ b/tests/test-atomic.c @@ -61,6 +61,15 @@ ovs_assert(value == 8); \ } +#define TEST_ATOMIC_FLAG_TEST_SET() \ + { \ + 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 +99,6 @@ main(void) TEST_ATOMIC_TYPE(atomic_uint64_t, uint64_t); TEST_ATOMIC_TYPE(atomic_int64_t, int64_t); + TEST_ATOMIC_FLAG_TEST_SET(); return 0; } -- 1.7.9.5 _______________________________________________ dev mailing list [email protected] http://openvswitch.org/mailman/listinfo/dev
