The upcoming RCU library will use these. Signed-off-by: Ben Pfaff <b...@nicira.com> --- lib/ovs-atomic-clang.h | 4 +++- lib/ovs-atomic-gcc4+.h | 2 ++ lib/ovs-atomic-gcc4.7+.h | 4 +++- lib/ovs-atomic-pthreads.h | 1 + lib/ovs-atomic.h | 23 +++++++++++++++++++++++ 5 files changed, 32 insertions(+), 2 deletions(-)
diff --git a/lib/ovs-atomic-clang.h b/lib/ovs-atomic-clang.h index 7449428..60552ae 100644 --- a/lib/ovs-atomic-clang.h +++ b/lib/ovs-atomic-clang.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Nicira, Inc. + * Copyright (c) 2013, 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. @@ -60,6 +60,8 @@ typedef _Atomic(int16_t) atomic_int16_t; typedef _Atomic(int32_t) atomic_int32_t; typedef _Atomic(int64_t) atomic_int64_t; +#define ATOMIC_POINTER_TYPE(TYPE) _Atomic(TYPE) + #define ATOMIC_VAR_INIT(VALUE) (VALUE) #define atomic_init(OBJECT, VALUE) __c11_atomic_init(OBJECT, VALUE) diff --git a/lib/ovs-atomic-gcc4+.h b/lib/ovs-atomic-gcc4+.h index 8e8b8e0..5be606b 100644 --- a/lib/ovs-atomic-gcc4+.h +++ b/lib/ovs-atomic-gcc4+.h @@ -102,6 +102,8 @@ typedef LOCKLESS_ATOMIC(int32_t) atomic_int32_t; typedef struct locked_int64 atomic_int64_t; #endif +#define ATOMIC_POINTER_TYPE(TYPE) struct { TYPE value; } + typedef enum { memory_order_relaxed, memory_order_consume, diff --git a/lib/ovs-atomic-gcc4.7+.h b/lib/ovs-atomic-gcc4.7+.h index 56d265f..b11a546 100644 --- a/lib/ovs-atomic-gcc4.7+.h +++ b/lib/ovs-atomic-gcc4.7+.h @@ -1,5 +1,5 @@ /* - * Copyright (c) 2013 Nicira, Inc. + * Copyright (c) 2013, 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. @@ -60,6 +60,8 @@ typedef uint32_t atomic_uint32_t; typedef int64_t atomic_int64_t; typedef uint64_t atomic_uint64_t; +#define ATOMIC_POINTER_TYPE(TYPE) TYPE + typedef enum { memory_order_relaxed = __ATOMIC_RELAXED, memory_order_consume = __ATOMIC_CONSUME, diff --git a/lib/ovs-atomic-pthreads.h b/lib/ovs-atomic-pthreads.h index b0ca524..89eed45 100644 --- a/lib/ovs-atomic-pthreads.h +++ b/lib/ovs-atomic-pthreads.h @@ -66,6 +66,7 @@ typedef PTHREAD_ATOMIC_TYPE(int16_t) atomic_int16_t; typedef PTHREAD_ATOMIC_TYPE(int32_t) atomic_int32_t; typedef PTHREAD_ATOMIC_TYPE(uint64_t) atomic_uint64_t; typedef PTHREAD_ATOMIC_TYPE(int64_t) atomic_int64_t; +#define ATOMIC_POINTER_TYPE(TYPE) struct { TYPE value; pthread_mutex_t mutex; } typedef enum { memory_order_relaxed, diff --git a/lib/ovs-atomic.h b/lib/ovs-atomic.h index 4d43a42..6110388 100644 --- a/lib/ovs-atomic.h +++ b/lib/ovs-atomic.h @@ -74,6 +74,29 @@ * * (*) Not specified by C11. * + * An additional category of atomic pointer types is available as + * ATOMIC_POINTER_TYPE(TYPE). For example, ATOMIC_POINTER_TYPE(void *) is an + * atomic pointer to void (atomic void *). The types generated by different + * invocations of ATOMIC_POINTER_TYPE aren't necessarily compatible, so use + * "typedef" where that is important. For example, the following might + * generate a compiler error because the two uses of ATOMIC_POINTER_TYPE don't + * create compatible types: + * + * void f(ATOMIC_POINTER_TYPE(void *) *); + * void g(void) { + * ATOMIC_POINTER_TYPE(void *) p; + * f(&p); + * } + * + * but correct code can be written as: + * + * typedef ATOMIC_POINTER_TYPE(void *) atomic_voidp; + * void f(atomic_voidp *); + * void g(void) { + * atomic_voidp p; + * f(&p); + * } + * * The atomic version of a type doesn't necessarily have the same size or * representation as the ordinary version; for example, atomic_int might be a * typedef for a struct that also includes a mutex. The range of an atomic -- 1.8.5.3 _______________________________________________ dev mailing list dev@openvswitch.org http://openvswitch.org/mailman/listinfo/dev