Sometimes we need to read and write 64-bit values (statistics) from multiple
threads. On 64-bit architectures it si possible to read 64-bit data while it is
being written without worrying about consistency.
On 32-bit architectures have to use some form of synchronization to make sure
that we are reading a consistent 64-bit value.

Therefore, 'u64_stats_lock' is introduced, which maps to a noop for 64-bits
architecture and to a mutex for other architetures.

Signed-off-by: Daniele Di Proietto <ddiproie...@vmware.com>
---
 lib/automake.mk      |  1 +
 lib/u64-stats-lock.h | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 66 insertions(+)
 create mode 100644 lib/u64-stats-lock.h

diff --git a/lib/automake.mk b/lib/automake.mk
index b83cceb..7f265ef 100644
--- a/lib/automake.mk
+++ b/lib/automake.mk
@@ -234,6 +234,7 @@ lib_libopenvswitch_la_SOURCES = \
        lib/token-bucket.c \
        lib/token-bucket.h \
        lib/type-props.h \
+       lib/u64-stats-lock.h \
        lib/unaligned.h \
        lib/unicode.c \
        lib/unicode.h \
diff --git a/lib/u64-stats-lock.h b/lib/u64-stats-lock.h
new file mode 100644
index 0000000..0db40a5
--- /dev/null
+++ b/lib/u64-stats-lock.h
@@ -0,0 +1,65 @@
+/*
+ * Copyright (c) 2014 Nicira, Inc.
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at:
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#ifndef U64_STATS_LOCK_H
+#define U64_STATS_LOCK_H 1
+
+#include "ovs-thread.h"
+
+#ifdef  __cplusplus
+extern "C" {
+#endif
+
+/* This type of lock should be used for accessing atomically 64-bit values from
+ * multiples threads. It maps to noop when compiling for 64-bit architectures,
+ * otherwise it is a mutex. The basic idea is similar to linux/u64_stats_sync.h
+ */
+
+#if !__GNUC__ || !defined(__x86_64__)
+#define U64_STATS_LOCK_NEEDS_MUTEX
+#endif
+
+struct OVS_LOCKABLE u64_stats_lock {
+#ifdef U64_STATS_LOCK_NEEDS_MUTEX
+    struct ovs_mutex mutex;
+#endif
+};
+
+static inline void
+u64_stats_lock_acquire(struct u64_stats_lock *l OVS_UNUSED)
+    OVS_ACQUIRES(l)
+    OVS_NO_THREAD_SAFETY_ANALYSIS
+{
+#ifdef U64_STATS_LOCK_NEEDS_MUTEX
+    ovs_mutex_lock(&l->mutex);
+#endif
+}
+
+static inline void
+u64_stats_lock_release(struct u64_stats_lock *l OVS_UNUSED)
+    OVS_RELEASES(l)
+    OVS_NO_THREAD_SAFETY_ANALYSIS
+{
+#ifdef U64_STATS_LOCK_NEEDS_MUTEX
+    ovs_mutex_unlock(&l->mutex);
+#endif
+}
+
+#ifdef  __cplusplus
+}
+#endif
+
+#endif /* u64-stats-lock.h */
-- 
2.1.0.rc1

_______________________________________________
dev mailing list
dev@openvswitch.org
http://openvswitch.org/mailman/listinfo/dev

Reply via email to