diff options
author | Ben Pfaff <blp@nicira.com> | 2013-06-28 15:54:40 -0700 |
---|---|---|
committer | Ben Pfaff <blp@nicira.com> | 2013-06-28 16:09:36 -0700 |
commit | 31a3fc6e3e9ce68d8bfebf65150d9455b9334dda (patch) | |
tree | 052b8e4940546c43a090730ee8fe248f1571ccda /lib/ovs-atomic-c11.h | |
parent | 42943cdef10197befc9acc8c6fdb632a210c055f (diff) |
ovs-atomic: New library for atomic operations.
This library should prove useful for the threading changes coming up.
The following commit introduces one (very simple) user.
Signed-off-by: Ben Pfaff <blp@nicira.com>
Acked-by: Ethan Jackson <ethan@nicira.com>
Diffstat (limited to 'lib/ovs-atomic-c11.h')
-rw-r--r-- | lib/ovs-atomic-c11.h | 62 |
1 files changed, 62 insertions, 0 deletions
diff --git a/lib/ovs-atomic-c11.h b/lib/ovs-atomic-c11.h new file mode 100644 index 00000000..9dc687c0 --- /dev/null +++ b/lib/ovs-atomic-c11.h @@ -0,0 +1,62 @@ +/* + * Copyright (c) 2013 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. + */ + +/* This header implements atomic operation primitives on compilers that + * have built-in support for C11 <stdatomic.h> */ +#ifndef IN_OVS_ATOMIC_H +#error "This header should only be included indirectly via ovs-atomic.h." +#endif + +#include <stdatomic.h> + +/* 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_read(SRC, DST) \ + atomic_read_explicit(SRC, DST, memory_order_seq_cst) +#define atomic_read_explicit(SRC, DST, ORDER) \ + (*(DST) = atomic_load_explicit(SRC, ORDER), \ + (void) 0) + +#define atomic_add(RMW, ARG, ORIG) \ + atomic_add_explicit(RMW, ARG, ORIG, memory_order_seq_cst) +#define atomic_sub(RMW, ARG, ORIG) \ + atomic_sub_explicit(RMW, ARG, ORIG, memory_order_seq_cst) +#define atomic_or(RMW, ARG, ORIG) \ + atomic_or_explicit(RMW, ARG, ORIG, memory_order_seq_cst) +#define atomic_xor(RMW, ARG, ORIG) \ + atomic_xor_explicit(RMW, ARG, ORIG, memory_order_seq_cst) +#define atomic_and(RMW, ARG, ORIG) \ + atomic_and_explicit(RMW, ARG, ORIG, memory_order_seq_cst) + +#define atomic_add_explicit(RMW, ARG, ORIG, ORDER) \ + (*(ORIG) = atomic_fetch_add_explicit(RMW, ARG, ORDER), (void) 0) +#define atomic_sub_explicit(RMW, ARG, ORIG, ORDER) \ + (*(ORIG) = atomic_fetch_sub_explicit(RMW, ARG, ORDER), (void) 0) +#define atomic_or_explicit(RMW, ARG, ORIG, ORDER) \ + (*(ORIG) = atomic_fetch_or_explicit(RMW, ARG, ORDER), (void) 0) +#define atomic_xor_explicit(RMW, ARG, ORIG, ORDER) \ + (*(ORIG) = atomic_fetch_xor_explicit(RMW, ARG, ORDER), (void) 0) +#define atomic_and_explicit(RMW, ARG, ORIG, ORDER) \ + (*(ORIG) = atomic_fetch_and_explicit(RMW, ARG, ORDER), (void) 0) |