[PATCH] [libcxx] Cleanup <atomic> and cleanup support for C++03.

Eric Fiselier eric at efcs.ca
Tue May 26 17:48:31 PDT 2015


Hi mclow.lists,

There are many places where libc++ want to use <atomic> internally in C++03 code. Unfortunately `<atomic>` currently only supports C++11 and later. This patch extends <atomic> so that everything except `ATOMIC_VAR_INIT` and `ATOMIC_FLAG_INIT` can be used in c++03 code.

This patch introduces the macros:
* `_LIBCPP_HAS_C11_ATOMICS`: Defined if `__has_extension(c_atomic)` is true.
* `_LIBCPP_HAS_CXX_ATOMICS`: Defined if we have C11 atomics from clang or the `__atomic_*` builtin family from GCC and libc++ is configured for threads. If `_LIBCPP_HAS_CXX_ATOMICS` is defined then the `<atomic>` header should be safe to include.


Other Misc changes:
* `__gcc_atomic_t` default constructs the stored value. This make it perform the same as `_Atomic`.
* `constexpr` -> `_LIBCPP_CONSTEXPR`
* `noexcept` -> `TEST_NOEXCEPT` in the tests.
* re-implement `std::atomic::is_lock_free()` to prevent needing `libatomic` with GCC.

http://reviews.llvm.org/D10046

Files:
  include/__config
  include/atomic
  include/ios
  include/memory
  src/ios.cpp
  src/memory.cpp
  test/libcxx/atomics/init_macros.pass.cpp
  test/libcxx/atomics/libcpp-has-no-threads.fail.cpp
  test/libcxx/atomics/libcpp-has-no-threads.pass.cpp
  test/libcxx/atomics/version.pass.cpp
  test/std/atomics/atomics.flag/atomic_flag_clear.pass.cpp
  test/std/atomics/atomics.flag/atomic_flag_clear_explicit.pass.cpp
  test/std/atomics/atomics.flag/clear.pass.cpp
  test/std/atomics/atomics.flag/init.pass.cpp
  test/std/atomics/atomics.types.generic/trivially_copyable.fail.cpp
  test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_strong.pass.cpp
  test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_strong_explicit.pass.cpp
  test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_weak.pass.cpp
  test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_compare_exchange_weak_explicit.pass.cpp
  test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_exchange.pass.cpp
  test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_exchange_explicit.pass.cpp
  test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add.pass.cpp
  test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_add_explicit.pass.cpp
  test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_sub.pass.cpp
  test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_fetch_sub_explicit.pass.cpp
  test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_init.pass.cpp
  test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_load.pass.cpp
  test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_load_explicit.pass.cpp
  test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_store.pass.cpp
  test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_store_explicit.pass.cpp
  test/std/atomics/atomics.types.operations/atomics.types.operations.req/atomic_var_init.pass.cpp
  test/std/atomics/libcpp-has-no-threads.fail.cpp
  test/std/atomics/libcpp-has-no-threads.pass.cpp
  test/std/atomics/version.pass.cpp
  test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_strong.pass.cpp
  test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_strong_explicit.pass.cpp
  test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_weak.pass.cpp
  test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_compare_exchange_weak_explicit.pass.cpp
  test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_exchange.pass.cpp
  test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_exchange_explicit.pass.cpp
  test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_is_lock_free.pass.cpp
  test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_load.pass.cpp
  test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_load_explicit.pass.cpp
  test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_store.pass.cpp
  test/std/utilities/memory/util.smartptr/util.smartptr.shared.atomic/atomic_store_explicit.pass.cpp

EMAIL PREFERENCES
  http://reviews.llvm.org/settings/panel/emailpreferences/
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D10046.26556.patch
Type: text/x-patch
Size: 36132 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/cfe-commits/attachments/20150527/3ed5fe09/attachment.bin>


More information about the cfe-commits mailing list