From 06aaf0b3431f29b6debbb96fdd92ada896f336ff Mon Sep 17 00:00:00 2001 From: Olivier Giroux Date: Mon, 1 Jun 2020 14:30:13 -0700 Subject: [PATCH] Updated synopsis of to match what is implemented --- libcxx/include/atomic | 423 ++++++++++++++++++++++++++------------------------ 1 file changed, 222 insertions(+), 201 deletions(-) diff --git a/libcxx/include/atomic b/libcxx/include/atomic index c25bea8..9c28986 100644 --- a/libcxx/include/atomic +++ b/libcxx/include/atomic @@ -54,60 +54,30 @@ template T kill_dependency(T y) noexcept; #define ATOMIC_LLONG_LOCK_FREE unspecified #define ATOMIC_POINTER_LOCK_FREE unspecified -// flag type and operations - -typedef struct atomic_flag -{ - bool test_and_set(memory_order m = memory_order_seq_cst) volatile noexcept; - bool test_and_set(memory_order m = memory_order_seq_cst) noexcept; - void clear(memory_order m = memory_order_seq_cst) volatile noexcept; - void clear(memory_order m = memory_order_seq_cst) noexcept; - atomic_flag() noexcept = default; - atomic_flag(const atomic_flag&) = delete; - atomic_flag& operator=(const atomic_flag&) = delete; - atomic_flag& operator=(const atomic_flag&) volatile = delete; -} atomic_flag; - -bool - atomic_flag_test_and_set(volatile atomic_flag* obj) noexcept; - -bool - atomic_flag_test_and_set(atomic_flag* obj) noexcept; - -bool - atomic_flag_test_and_set_explicit(volatile atomic_flag* obj, - memory_order m) noexcept; - -bool - atomic_flag_test_and_set_explicit(atomic_flag* obj, memory_order m) noexcept; - -void - atomic_flag_clear(volatile atomic_flag* obj) noexcept; - -void - atomic_flag_clear(atomic_flag* obj) noexcept; - -void - atomic_flag_clear_explicit(volatile atomic_flag* obj, memory_order m) noexcept; - -void - atomic_flag_clear_explicit(atomic_flag* obj, memory_order m) noexcept; - -#define ATOMIC_FLAG_INIT see below -#define ATOMIC_VAR_INIT(value) see below - template struct atomic { + using value_type = T; + static constexpr bool is_always_lock_free; bool is_lock_free() const volatile noexcept; bool is_lock_free() const noexcept; - void store(T desr, memory_order m = memory_order_seq_cst) volatile noexcept; - void store(T desr, memory_order m = memory_order_seq_cst) noexcept; + + atomic() noexcept = default; + constexpr atomic(T desr) noexcept; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + T load(memory_order m = memory_order_seq_cst) const volatile noexcept; T load(memory_order m = memory_order_seq_cst) const noexcept; operator T() const volatile noexcept; operator T() const noexcept; + void store(T desr, memory_order m = memory_order_seq_cst) volatile noexcept; + void store(T desr, memory_order m = memory_order_seq_cst) noexcept; + T operator=(T) volatile noexcept; + T operator=(T) noexcept; + T exchange(T desr, memory_order m = memory_order_seq_cst) volatile noexcept; T exchange(T desr, memory_order m = memory_order_seq_cst) noexcept; bool compare_exchange_weak(T& expc, T desr, @@ -126,27 +96,38 @@ struct atomic bool compare_exchange_strong(T& expc, T desr, memory_order m = memory_order_seq_cst) noexcept; - atomic() noexcept = default; - constexpr atomic(T desr) noexcept; - atomic(const atomic&) = delete; - atomic& operator=(const atomic&) = delete; - atomic& operator=(const atomic&) volatile = delete; - T operator=(T) volatile noexcept; - T operator=(T) noexcept; + void wait(T, memory_order = memory_order::seq_cst) const volatile noexcept; + void wait(T, memory_order = memory_order::seq_cst) const noexcept; + void notify_one() volatile noexcept; + void notify_one() noexcept; + void notify_all() volatile noexcept; + void notify_all() noexcept; }; template <> struct atomic { + using value_type = integral; + static constexpr bool is_always_lock_free; bool is_lock_free() const volatile noexcept; bool is_lock_free() const noexcept; - void store(integral desr, memory_order m = memory_order_seq_cst) volatile noexcept; - void store(integral desr, memory_order m = memory_order_seq_cst) noexcept; + + atomic() noexcept = default; + constexpr atomic(integral desr) noexcept; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + integral load(memory_order m = memory_order_seq_cst) const volatile noexcept; integral load(memory_order m = memory_order_seq_cst) const noexcept; operator integral() const volatile noexcept; operator integral() const noexcept; + void store(integral desr, memory_order m = memory_order_seq_cst) volatile noexcept; + void store(integral desr, memory_order m = memory_order_seq_cst) noexcept; + integral operator=(integral desr) volatile noexcept; + integral operator=(integral desr) noexcept; + integral exchange(integral desr, memory_order m = memory_order_seq_cst) volatile noexcept; integral exchange(integral desr, memory_order m = memory_order_seq_cst) noexcept; @@ -167,30 +148,17 @@ struct atomic bool compare_exchange_strong(integral& expc, integral desr, memory_order m = memory_order_seq_cst) noexcept; - integral - fetch_add(integral op, memory_order m = memory_order_seq_cst) volatile noexcept; + integral fetch_add(integral op, memory_order m = memory_order_seq_cst) volatile noexcept; integral fetch_add(integral op, memory_order m = memory_order_seq_cst) noexcept; - integral - fetch_sub(integral op, memory_order m = memory_order_seq_cst) volatile noexcept; + integral fetch_sub(integral op, memory_order m = memory_order_seq_cst) volatile noexcept; integral fetch_sub(integral op, memory_order m = memory_order_seq_cst) noexcept; - integral - fetch_and(integral op, memory_order m = memory_order_seq_cst) volatile noexcept; + integral fetch_and(integral op, memory_order m = memory_order_seq_cst) volatile noexcept; integral fetch_and(integral op, memory_order m = memory_order_seq_cst) noexcept; - integral - fetch_or(integral op, memory_order m = memory_order_seq_cst) volatile noexcept; + integral fetch_or(integral op, memory_order m = memory_order_seq_cst) volatile noexcept; integral fetch_or(integral op, memory_order m = memory_order_seq_cst) noexcept; - integral - fetch_xor(integral op, memory_order m = memory_order_seq_cst) volatile noexcept; + integral fetch_xor(integral op, memory_order m = memory_order_seq_cst) volatile noexcept; integral fetch_xor(integral op, memory_order m = memory_order_seq_cst) noexcept; - atomic() noexcept = default; - constexpr atomic(integral desr) noexcept; - atomic(const atomic&) = delete; - atomic& operator=(const atomic&) = delete; - atomic& operator=(const atomic&) volatile = delete; - integral operator=(integral desr) volatile noexcept; - integral operator=(integral desr) noexcept; - integral operator++(int) volatile noexcept; integral operator++(int) noexcept; integral operator--(int) volatile noexcept; @@ -209,20 +177,39 @@ struct atomic integral operator|=(integral op) noexcept; integral operator^=(integral op) volatile noexcept; integral operator^=(integral op) noexcept; + + void wait(integral, memory_order = memory_order::seq_cst) const volatile noexcept; + void wait(integral, memory_order = memory_order::seq_cst) const noexcept; + void notify_one() volatile noexcept; + void notify_one() noexcept; + void notify_all() volatile noexcept; + void notify_all() noexcept; }; template struct atomic { + using value_type = T*; + static constexpr bool is_always_lock_free; bool is_lock_free() const volatile noexcept; bool is_lock_free() const noexcept; - void store(T* desr, memory_order m = memory_order_seq_cst) volatile noexcept; - void store(T* desr, memory_order m = memory_order_seq_cst) noexcept; + + atomic() noexcept = default; + constexpr atomic(T* desr) noexcept; + atomic(const atomic&) = delete; + atomic& operator=(const atomic&) = delete; + atomic& operator=(const atomic&) volatile = delete; + T* load(memory_order m = memory_order_seq_cst) const volatile noexcept; T* load(memory_order m = memory_order_seq_cst) const noexcept; operator T*() const volatile noexcept; operator T*() const noexcept; + void store(T* desr, memory_order m = memory_order_seq_cst) volatile noexcept; + void store(T* desr, memory_order m = memory_order_seq_cst) noexcept; + T* operator=(T*) volatile noexcept; + T* operator=(T*) noexcept; + T* exchange(T* desr, memory_order m = memory_order_seq_cst) volatile noexcept; T* exchange(T* desr, memory_order m = memory_order_seq_cst) noexcept; bool compare_exchange_weak(T*& expc, T* desr, @@ -246,14 +233,6 @@ struct atomic T* fetch_sub(ptrdiff_t op, memory_order m = memory_order_seq_cst) volatile noexcept; T* fetch_sub(ptrdiff_t op, memory_order m = memory_order_seq_cst) noexcept; - atomic() noexcept = default; - constexpr atomic(T* desr) noexcept; - atomic(const atomic&) = delete; - atomic& operator=(const atomic&) = delete; - atomic& operator=(const atomic&) volatile = delete; - - T* operator=(T*) volatile noexcept; - T* operator=(T*) noexcept; T* operator++(int) volatile noexcept; T* operator++(int) noexcept; T* operator--(int) volatile noexcept; @@ -266,224 +245,206 @@ struct atomic T* operator+=(ptrdiff_t op) noexcept; T* operator-=(ptrdiff_t op) volatile noexcept; T* operator-=(ptrdiff_t op) noexcept; + + void wait(T*, memory_order = memory_order::seq_cst) const volatile noexcept; + void wait(T*, memory_order = memory_order::seq_cst) const noexcept; + void notify_one() volatile noexcept; + void notify_one() noexcept; + void notify_all() volatile noexcept; + void notify_all() noexcept; }; template - bool - atomic_is_lock_free(const volatile atomic* obj) noexcept; + bool atomic_is_lock_free(const volatile atomic* obj) noexcept; + +template + bool atomic_is_lock_free(const atomic* obj) noexcept; + +template + void atomic_store(volatile atomic* obj, T desr) noexcept; template - bool - atomic_is_lock_free(const atomic* obj) noexcept; + void atomic_store(atomic* obj, T desr) noexcept; template - void - atomic_init(volatile atomic* obj, T desr) noexcept; + void atomic_store_explicit(volatile atomic* obj, T desr, memory_order m) noexcept; template - void - atomic_init(atomic* obj, T desr) noexcept; + void atomic_store_explicit(atomic* obj, T desr, memory_order m) noexcept; template - void - atomic_store(volatile atomic* obj, T desr) noexcept; + T atomic_load(const volatile atomic* obj) noexcept; template - void - atomic_store(atomic* obj, T desr) noexcept; + T atomic_load(const atomic* obj) noexcept; template - void - atomic_store_explicit(volatile atomic* obj, T desr, memory_order m) noexcept; + T atomic_load_explicit(const volatile atomic* obj, memory_order m) noexcept; template - void - atomic_store_explicit(atomic* obj, T desr, memory_order m) noexcept; + T atomic_load_explicit(const atomic* obj, memory_order m) noexcept; template - T - atomic_load(const volatile atomic* obj) noexcept; + T atomic_exchange(volatile atomic* obj, T desr) noexcept; template - T - atomic_load(const atomic* obj) noexcept; + T atomic_exchange(atomic* obj, T desr) noexcept; template - T - atomic_load_explicit(const volatile atomic* obj, memory_order m) noexcept; + T atomic_exchange_explicit(volatile atomic* obj, T desr, memory_order m) noexcept; template - T - atomic_load_explicit(const atomic* obj, memory_order m) noexcept; + T atomic_exchange_explicit(atomic* obj, T desr, memory_order m) noexcept; template - T - atomic_exchange(volatile atomic* obj, T desr) noexcept; + bool atomic_compare_exchange_weak(volatile atomic* obj, T* expc, T desr) noexcept; template - T - atomic_exchange(atomic* obj, T desr) noexcept; + bool atomic_compare_exchange_weak(atomic* obj, T* expc, T desr) noexcept; template - T - atomic_exchange_explicit(volatile atomic* obj, T desr, memory_order m) noexcept; + bool atomic_compare_exchange_strong(volatile atomic* obj, T* expc, T desr) noexcept; template - T - atomic_exchange_explicit(atomic* obj, T desr, memory_order m) noexcept; + bool atomic_compare_exchange_strong(atomic* obj, T* expc, T desr) noexcept; template - bool - atomic_compare_exchange_weak(volatile atomic* obj, T* expc, T desr) noexcept; + bool atomic_compare_exchange_weak_explicit(volatile atomic* obj, T* expc, + T desr, + memory_order s, memory_order f) noexcept; template - bool - atomic_compare_exchange_weak(atomic* obj, T* expc, T desr) noexcept; + bool atomic_compare_exchange_weak_explicit(atomic* obj, T* expc, T desr, + memory_order s, memory_order f) noexcept; template - bool - atomic_compare_exchange_strong(volatile atomic* obj, T* expc, T desr) noexcept; + bool atomic_compare_exchange_strong_explicit(volatile atomic* obj, + T* expc, T desr, + memory_order s, memory_order f) noexcept; template - bool - atomic_compare_exchange_strong(atomic* obj, T* expc, T desr) noexcept; + bool atomic_compare_exchange_strong_explicit(atomic* obj, T* expc, + T desr, + memory_order s, memory_order f) noexcept; template - bool - atomic_compare_exchange_weak_explicit(volatile atomic* obj, T* expc, - T desr, - memory_order s, memory_order f) noexcept; + void atomic_wait(const volatile atomic* obj, T old) noexcept; template - bool - atomic_compare_exchange_weak_explicit(atomic* obj, T* expc, T desr, - memory_order s, memory_order f) noexcept; + void atomic_wait(const atomic* obj, T old) noexcept; template - bool - atomic_compare_exchange_strong_explicit(volatile atomic* obj, - T* expc, T desr, - memory_order s, memory_order f) noexcept; + void atomic_wait_explicit(const volatile atomic* obj, T old, memory_order m) noexcept; template - bool - atomic_compare_exchange_strong_explicit(atomic* obj, T* expc, - T desr, - memory_order s, memory_order f) noexcept; + void atomic_wait_explicit(const atomic* obj, T old, memory_order m) noexcept; + +template + void atomic_one(volatile atomic* obj) noexcept; + +template + void atomic_one(atomic* obj) noexcept; + +template + void atomic_all(volatile atomic* obj) noexcept; + +template + void atomic_all(atomic* obj) noexcept; template - Integral - atomic_fetch_add(volatile atomic* obj, Integral op) noexcept; + Integral atomic_fetch_add(volatile atomic* obj, Integral op) noexcept; template - Integral - atomic_fetch_add(atomic* obj, Integral op) noexcept; + Integral atomic_fetch_add(atomic* obj, Integral op) noexcept; template - Integral - atomic_fetch_add_explicit(volatile atomic* obj, Integral op, + Integral atomic_fetch_add_explicit(volatile atomic* obj, Integral op, memory_order m) noexcept; template - Integral - atomic_fetch_add_explicit(atomic* obj, Integral op, + Integral atomic_fetch_add_explicit(atomic* obj, Integral op, memory_order m) noexcept; template - Integral - atomic_fetch_sub(volatile atomic* obj, Integral op) noexcept; + Integral atomic_fetch_sub(volatile atomic* obj, Integral op) noexcept; template - Integral - atomic_fetch_sub(atomic* obj, Integral op) noexcept; + Integral atomic_fetch_sub(atomic* obj, Integral op) noexcept; template - Integral - atomic_fetch_sub_explicit(volatile atomic* obj, Integral op, - memory_order m) noexcept; + Integral atomic_fetch_sub_explicit(volatile atomic* obj, Integral op, + memory_order m) noexcept; + template - Integral - atomic_fetch_sub_explicit(atomic* obj, Integral op, - memory_order m) noexcept; + Integral atomic_fetch_sub_explicit(atomic* obj, Integral op, + memory_order m) noexcept; + template - Integral - atomic_fetch_and(volatile atomic* obj, Integral op) noexcept; + Integral atomic_fetch_and(volatile atomic* obj, Integral op) noexcept; template - Integral - atomic_fetch_and(atomic* obj, Integral op) noexcept; + Integral atomic_fetch_and(atomic* obj, Integral op) noexcept; template - Integral - atomic_fetch_and_explicit(volatile atomic* obj, Integral op, - memory_order m) noexcept; + Integral atomic_fetch_and_explicit(volatile atomic* obj, Integral op, + memory_order m) noexcept; + template - Integral - atomic_fetch_and_explicit(atomic* obj, Integral op, - memory_order m) noexcept; + Integral atomic_fetch_and_explicit(atomic* obj, Integral op, + memory_order m) noexcept; + template - Integral - atomic_fetch_or(volatile atomic* obj, Integral op) noexcept; + Integral atomic_fetch_or(volatile atomic* obj, Integral op) noexcept; template - Integral - atomic_fetch_or(atomic* obj, Integral op) noexcept; + Integral atomic_fetch_or(atomic* obj, Integral op) noexcept; template - Integral - atomic_fetch_or_explicit(volatile atomic* obj, Integral op, + Integral atomic_fetch_or_explicit(volatile atomic* obj, Integral op, memory_order m) noexcept; + template - Integral - atomic_fetch_or_explicit(atomic* obj, Integral op, + Integral atomic_fetch_or_explicit(atomic* obj, Integral op, memory_order m) noexcept; + template - Integral - atomic_fetch_xor(volatile atomic* obj, Integral op) noexcept; + Integral atomic_fetch_xor(volatile atomic* obj, Integral op) noexcept; template - Integral - atomic_fetch_xor(atomic* obj, Integral op) noexcept; + Integral atomic_fetch_xor(atomic* obj, Integral op) noexcept; template - Integral - atomic_fetch_xor_explicit(volatile atomic* obj, Integral op, - memory_order m) noexcept; + Integral atomic_fetch_xor_explicit(volatile atomic* obj, Integral op, + memory_order m) noexcept; + template - Integral - atomic_fetch_xor_explicit(atomic* obj, Integral op, - memory_order m) noexcept; + Integral atomic_fetch_xor_explicit(atomic* obj, Integral op, + memory_order m) noexcept; template - T* - atomic_fetch_add(volatile atomic* obj, ptrdiff_t op) noexcept; + T* atomic_fetch_add(volatile atomic* obj, ptrdiff_t op) noexcept; template - T* - atomic_fetch_add(atomic* obj, ptrdiff_t op) noexcept; + T* atomic_fetch_add(atomic* obj, ptrdiff_t op) noexcept; template - T* - atomic_fetch_add_explicit(volatile atomic* obj, ptrdiff_t op, - memory_order m) noexcept; + T* atomic_fetch_add_explicit(volatile atomic* obj, ptrdiff_t op, + memory_order m) noexcept; + template - T* - atomic_fetch_add_explicit(atomic* obj, ptrdiff_t op, memory_order m) noexcept; + T* atomic_fetch_add_explicit(atomic* obj, ptrdiff_t op, memory_order m) noexcept; template - T* - atomic_fetch_sub(volatile atomic* obj, ptrdiff_t op) noexcept; + T* atomic_fetch_sub(volatile atomic* obj, ptrdiff_t op) noexcept; template - T* - atomic_fetch_sub(atomic* obj, ptrdiff_t op) noexcept; + T* atomic_fetch_sub(atomic* obj, ptrdiff_t op) noexcept; template - T* - atomic_fetch_sub_explicit(volatile atomic* obj, ptrdiff_t op, - memory_order m) noexcept; + T* atomic_fetch_sub_explicit(volatile atomic* obj, ptrdiff_t op, + memory_order m) noexcept; + template - T* - atomic_fetch_sub_explicit(atomic* obj, ptrdiff_t op, memory_order m) noexcept; + T* atomic_fetch_sub_explicit(atomic* obj, ptrdiff_t op, memory_order m) noexcept; // Atomics for standard typedef types @@ -516,7 +477,7 @@ typedef atomic atomic_int_fast8_t; typedef atomic atomic_uint_fast8_t; typedef atomic atomic_int_fast16_t; typedef atomic atomic_uint_fast16_t; -typedef atomic atomic_int_fast32_t; +typedef atomic atomic_int_fast32_t; typedef atomic atomic_uint_fast32_t; typedef atomic atomic_int_fast64_t; typedef atomic atomic_uint_fast64_t; @@ -537,11 +498,71 @@ typedef atomic atomic_ptrdiff_t; typedef atomic atomic_intmax_t; typedef atomic atomic_uintmax_t; +// flag type and operations + +typedef struct atomic_flag +{ + atomic_flag() noexcept = default; + atomic_flag(const atomic_flag&) = delete; + atomic_flag& operator=(const atomic_flag&) = delete; + atomic_flag& operator=(const atomic_flag&) volatile = delete; + + bool test(memory_order m = memory_order_seq_cst) volatile noexcept; + bool test(memory_order m = memory_order_seq_cst) noexcept; + bool test_and_set(memory_order m = memory_order_seq_cst) volatile noexcept; + bool test_and_set(memory_order m = memory_order_seq_cst) noexcept; + void clear(memory_order m = memory_order_seq_cst) volatile noexcept; + void clear(memory_order m = memory_order_seq_cst) noexcept; + + void wait(bool, memory_order = memory_order::seq_cst) const volatile noexcept; + void wait(bool, memory_order = memory_order::seq_cst) const noexcept; + void notify_one() volatile noexcept; + void notify_one() noexcept; + void notify_all() volatile noexcept; + void notify_all() noexcept; +} atomic_flag; + +bool atomic_flag_test(volatile atomic_flag* obj) noexcept; +bool atomic_flag_test(atomic_flag* obj) noexcept; +bool atomic_flag_test_explicit(volatile atomic_flag* obj, + memory_order m) noexcept; +bool atomic_flag_test_explicit(atomic_flag* obj, memory_order m) noexcept; +bool atomic_flag_test_and_set(volatile atomic_flag* obj) noexcept; +bool atomic_flag_test_and_set(atomic_flag* obj) noexcept; +bool atomic_flag_test_and_set_explicit(volatile atomic_flag* obj, + memory_order m) noexcept; +bool atomic_flag_test_and_set_explicit(atomic_flag* obj, memory_order m) noexcept; +void atomic_flag_clear(volatile atomic_flag* obj) noexcept; +void atomic_flag_clear(atomic_flag* obj) noexcept; +void atomic_flag_clear_explicit(volatile atomic_flag* obj, memory_order m) noexcept; +void atomic_flag_clear_explicit(atomic_flag* obj, memory_order m) noexcept; + +void atomic_wait(const volatile atomic_flag* obj, T old) noexcept; +void atomic_wait(const atomic_flag* obj, T old) noexcept; +void atomic_wait_explicit(const volatile atomic_flag* obj, T old, memory_order m) noexcept; +void atomic_wait_explicit(const atomic_flag* obj, T old, memory_order m) noexcept; +void atomic_one(volatile atomic_flag* obj) noexcept; +void atomic_one(atomic_flag* obj) noexcept; +void atomic_all(volatile atomic_flag* obj) noexcept; +void atomic_all(atomic_flag* obj) noexcept; + // fences void atomic_thread_fence(memory_order m) noexcept; void atomic_signal_fence(memory_order m) noexcept; +// deprecated + +template + void atomic_init(volatile atomic* obj, typename atomic::value_type desr) noexcept; + +template + void atomic_init(atomic* obj, typename atomic::value_type desr) noexcept; + +#define ATOMIC_VAR_INIT(value) see below + +#define ATOMIC_FLAG_INIT see below + } // std */ -- 2.7.4