From: Ben Pfaff Date: Tue, 11 Mar 2014 20:37:27 +0000 (-0700) Subject: ovs-atomic: Factor type declarations out of most implementations. X-Git-Tag: sliver-openvswitch-2.2.90-1~6^2~116 X-Git-Url: http://git.onelab.eu/?a=commitdiff_plain;h=7d53f6b0228e40b9c1ebef83ce8273a8f0103520;hp=e205100808563d803fd983b610865c5aceb09e9d;p=sliver-openvswitch.git ovs-atomic: Factor type declarations out of most implementations. This reduces duplicate code. Signed-off-by: Ben Pfaff Acked-by: Andy Zhou --- diff --git a/lib/automake.mk b/lib/automake.mk index 926767cca..f4aa9e307 100644 --- a/lib/automake.mk +++ b/lib/automake.mk @@ -144,6 +144,7 @@ lib_libopenvswitch_la_SOURCES = \ lib/ovs-atomic-gcc4.7+.h \ lib/ovs-atomic-pthreads.c \ lib/ovs-atomic-pthreads.h \ + lib/ovs-atomic-types.h \ lib/ovs-atomic.h \ lib/ovs-thread.c \ lib/ovs-thread.h \ diff --git a/lib/ovs-atomic-c11.h b/lib/ovs-atomic-c11.h index 97262b27b..96aec7ceb 100644 --- a/lib/ovs-atomic-c11.h +++ b/lib/ovs-atomic-c11.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. @@ -22,16 +22,9 @@ #include -/* Nonstandard atomic types. */ -typedef _Atomic(uint8_t) atomic_uint8_t; -typedef _Atomic(uint16_t) atomic_uint16_t; -typedef _Atomic(uint32_t) atomic_uint32_t; -typedef _Atomic(uint64_t) atomic_uint64_t; - -typedef _Atomic(int8_t) atomic_int8_t; -typedef _Atomic(int16_t) atomic_int16_t; -typedef _Atomic(int32_t) atomic_int32_t; -typedef _Atomic(int64_t) atomic_int64_t; +#define OMIT_STANDARD_ATOMIC_TYPES 1 +#define ATOMIC(TYPE) _Atomic(TYPE) +#include "ovs-atomic-types.h" #define atomic_read(SRC, DST) \ atomic_read_explicit(SRC, DST, memory_order_seq_cst) diff --git a/lib/ovs-atomic-clang.h b/lib/ovs-atomic-clang.h index 7449428f8..c169f37b9 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. @@ -21,44 +21,8 @@ #define OVS_ATOMIC_CLANG_IMPL 1 -/* Standard atomic types. */ -typedef _Atomic(_Bool) atomic_bool; - -typedef _Atomic(char) atomic_char; -typedef _Atomic(signed char) atomic_schar; -typedef _Atomic(unsigned char) atomic_uchar; - -typedef _Atomic(short) atomic_short; -typedef _Atomic(unsigned short) atomic_ushort; - -typedef _Atomic(int) atomic_int; -typedef _Atomic(unsigned int) atomic_uint; - -typedef _Atomic(long) atomic_long; -typedef _Atomic(unsigned long) atomic_ulong; - -typedef _Atomic(long long) atomic_llong; -typedef _Atomic(unsigned long long) atomic_ullong; - -typedef _Atomic(size_t) atomic_size_t; -typedef _Atomic(ptrdiff_t) atomic_ptrdiff_t; - -typedef _Atomic(intmax_t) atomic_intmax_t; -typedef _Atomic(uintmax_t) atomic_uintmax_t; - -typedef _Atomic(intptr_t) atomic_intptr_t; -typedef _Atomic(uintptr_t) atomic_uintptr_t; - -/* Nonstandard atomic types. */ -typedef _Atomic(uint8_t) atomic_uint8_t; -typedef _Atomic(uint16_t) atomic_uint16_t; -typedef _Atomic(uint32_t) atomic_uint32_t; -typedef _Atomic(uint64_t) atomic_uint64_t; - -typedef _Atomic(int8_t) atomic_int8_t; -typedef _Atomic(int16_t) atomic_int16_t; -typedef _Atomic(int32_t) atomic_int32_t; -typedef _Atomic(int64_t) atomic_int64_t; +#define ATOMIC(TYPE) _Atomic(TYPE) +#include "ovs-atomic-types.h" #define ATOMIC_VAR_INIT(VALUE) (VALUE) diff --git a/lib/ovs-atomic-gcc4.7+.h b/lib/ovs-atomic-gcc4.7+.h index 56d265f9c..da8855870 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. @@ -19,46 +19,8 @@ #error "This header should only be included indirectly via ovs-atomic.h." #endif -/* C11 standardized atomic type. */ -typedef bool atomic_bool; - -typedef char atomic_char; -typedef signed char atomic_schar; -typedef unsigned char atomic_uchar; - -typedef short atomic_short; -typedef unsigned short atomic_ushort; - -typedef int atomic_int; -typedef unsigned int atomic_uint; - -typedef long atomic_long; -typedef unsigned long atomic_ulong; - -typedef long long atomic_llong; -typedef unsigned long long atomic_ullong; - -typedef size_t atomic_size_t; -typedef ptrdiff_t atomic_ptrdiff_t; - -typedef intmax_t atomic_intmax_t; -typedef uintmax_t atomic_uintmax_t; - -typedef intptr_t atomic_intptr_t; -typedef uintptr_t atomic_uintptr_t; - -/* Nonstandard atomic types. */ -typedef int8_t atomic_int8_t; -typedef uint8_t atomic_uint8_t; - -typedef int16_t atomic_int16_t; -typedef uint16_t atomic_uint16_t; - -typedef int32_t atomic_int32_t; -typedef uint32_t atomic_uint32_t; - -typedef int64_t atomic_int64_t; -typedef uint64_t atomic_uint64_t; +#define ATOMIC(TYPE) TYPE +#include "ovs-atomic-types.h" typedef enum { memory_order_relaxed = __ATOMIC_RELAXED, diff --git a/lib/ovs-atomic-pthreads.h b/lib/ovs-atomic-pthreads.h index dc8f49838..ff3992509 100644 --- a/lib/ovs-atomic-pthreads.h +++ b/lib/ovs-atomic-pthreads.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. @@ -21,55 +21,16 @@ #define OVS_ATOMIC_PTHREADS_IMPL 1 -#define DEFINE_PTHREAD_ATOMIC(TYPE, NAME) \ - typedef struct { \ - TYPE value; \ - pthread_mutex_t mutex; \ - } NAME; +#define ATOMIC(TYPE) struct { TYPE value; pthread_mutex_t mutex; } +#include "ovs-atomic-types.h" #define ATOMIC_BOOL_LOCK_FREE 0 -DEFINE_PTHREAD_ATOMIC(bool, atomic_bool); - #define ATOMIC_CHAR_LOCK_FREE 0 -DEFINE_PTHREAD_ATOMIC(char, atomic_char); -DEFINE_PTHREAD_ATOMIC(signed char, atomic_schar); -DEFINE_PTHREAD_ATOMIC(unsigned char, atomic_uchar); - #define ATOMIC_SHORT_LOCK_FREE 0 -DEFINE_PTHREAD_ATOMIC(short, atomic_short); -DEFINE_PTHREAD_ATOMIC(unsigned short, atomic_ushort); - #define ATOMIC_INT_LOCK_FREE 0 -DEFINE_PTHREAD_ATOMIC(int, atomic_int); -DEFINE_PTHREAD_ATOMIC(unsigned int, atomic_uint); - #define ATOMIC_LONG_LOCK_FREE 0 -DEFINE_PTHREAD_ATOMIC(long, atomic_long); -DEFINE_PTHREAD_ATOMIC(unsigned long, atomic_ulong); - #define ATOMIC_LLONG_LOCK_FREE 0 -DEFINE_PTHREAD_ATOMIC(long long, atomic_llong); -DEFINE_PTHREAD_ATOMIC(unsigned long long, atomic_ullong); - -DEFINE_PTHREAD_ATOMIC(size_t, atomic_size_t); -DEFINE_PTHREAD_ATOMIC(ptrdiff_t, atomic_ptrdiff_t); - -DEFINE_PTHREAD_ATOMIC(intmax_t, atomic_intmax_t); -DEFINE_PTHREAD_ATOMIC(uintmax_t, atomic_uintmax_t); - #define ATOMIC_POINTER_LOCK_FREE 0 -DEFINE_PTHREAD_ATOMIC(intptr_t, atomic_intptr_t); -DEFINE_PTHREAD_ATOMIC(uintptr_t, atomic_uintptr_t); - -/* Nonstandard atomic types. */ -DEFINE_PTHREAD_ATOMIC(uint8_t, atomic_uint8_t); -DEFINE_PTHREAD_ATOMIC(uint16_t, atomic_uint16_t); -DEFINE_PTHREAD_ATOMIC(uint32_t, atomic_uint32_t); -DEFINE_PTHREAD_ATOMIC(int8_t, atomic_int8_t); -DEFINE_PTHREAD_ATOMIC(int16_t, atomic_int16_t); -DEFINE_PTHREAD_ATOMIC(int32_t, atomic_int32_t); -DEFINE_PTHREAD_ATOMIC(uint64_t, atomic_uint64_t); -DEFINE_PTHREAD_ATOMIC(int64_t, atomic_int64_t); typedef enum { memory_order_relaxed, diff --git a/lib/ovs-atomic-types.h b/lib/ovs-atomic-types.h new file mode 100644 index 000000000..bbce476b4 --- /dev/null +++ b/lib/ovs-atomic-types.h @@ -0,0 +1,47 @@ +/* This header defines atomic_* types using an ATOMIC macro provided by the +* caller. */ +#ifndef IN_OVS_ATOMIC_H +#error "This header should only be included indirectly via ovs-atomic.h." +#endif + +#ifndef OMIT_STANDARD_ATOMIC_TYPES +typedef ATOMIC(bool) atomic_bool; + +typedef ATOMIC(char) atomic_char; +typedef ATOMIC(signed char) atomic_schar; +typedef ATOMIC(unsigned char) atomic_uchar; + +typedef ATOMIC(short) atomic_short; +typedef ATOMIC(unsigned short) atomic_ushort; + +typedef ATOMIC(int) atomic_int; +typedef ATOMIC(unsigned int) atomic_uint; + +typedef ATOMIC(long) atomic_long; +typedef ATOMIC(unsigned long) atomic_ulong; + +typedef ATOMIC(long long) atomic_llong; +typedef ATOMIC(unsigned long long) atomic_ullong; + +typedef ATOMIC(size_t) atomic_size_t; +typedef ATOMIC(ptrdiff_t) atomic_ptrdiff_t; + +typedef ATOMIC(intmax_t) atomic_intmax_t; +typedef ATOMIC(uintmax_t) atomic_uintmax_t; + +typedef ATOMIC(intptr_t) atomic_intptr_t; +typedef ATOMIC(uintptr_t) atomic_uintptr_t; +#endif /* !OMIT_STANDARD_ATOMIC_TYPES */ + +/* Nonstandard atomic types. */ +typedef ATOMIC(uint8_t) atomic_uint8_t; +typedef ATOMIC(uint16_t) atomic_uint16_t; +typedef ATOMIC(uint32_t) atomic_uint32_t; +typedef ATOMIC(uint64_t) atomic_uint64_t; + +typedef ATOMIC(int8_t) atomic_int8_t; +typedef ATOMIC(int16_t) atomic_int16_t; +typedef ATOMIC(int32_t) atomic_int32_t; +typedef ATOMIC(int64_t) atomic_int64_t; + +#undef OMIT_STANDARD_ATOMIC_TYPES