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