[ovs-dev] [PATCH] ovs-atomic-pthreads: Fix "has incomplete type" error.

Alex Wang alexw at nicira.com
Wed Jul 31 23:09:11 UTC 2013


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 <gshetty at nicira.com>
Signed-off-by: Alex Wang <alexw at nicira.com>
---
 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




More information about the dev mailing list