2
0
mirror of https://github.com/boostorg/atomic.git synced 2026-02-02 08:22:08 +00:00
Commit Graph

229 Commits

Author SHA1 Message Date
Andrey Semashev
8ed0729abb Renamed make_storage_type to storage_traits. 2020-02-29 23:52:19 +03:00
Andrey Semashev
59ee7c9e9e Removed support for BOOST_ATOMIC_DETAIL_HIGHLIGHT_OP_AND_TEST.
The macro was used to highlight the (op)_and_test methods of atomic<>
that changed the returned value to the opposite in Boost 1.67. The old
behavior was only released in 1.66 and the macro was a means to help
1.66 users to transition to the new releases.

1.67 will have been released 2 years before the upcoming 1.73 release,
in which this macro will be removed.
2020-02-29 23:52:19 +03:00
Andrey Semashev
c22d7f5bda Added value() accessor to atomic template, deprecated storage().
This commit changes how storage alignment is enforced and ensures
that the storage is sufficiently aligned for both atomic operations
and direct access to the stored value. This allowed to implement
the new value() accessor, which returns a reference to the stored
value. This is unlike the previously available storage() accessor,
which returns a reference to storage_type and requires users to cast
the reference to value_type, which is potentially unsafe.

The public storage() accessor is now deprecated in favor of value()
and storage_type - in favor of value_type. The deprecation warnings
can be disabled by defining BOOST_ATOMIC_SILENCE_STORAGE_DEPRECATION.
2020-02-29 23:51:39 +03:00
Andrey Semashev
7822509ce9 Use storage alignment specified by operations in generic atomic_ref.
When emulated operations backend is used, the storage type still has
high alignment requirement, possibly higher than that of the user's type.
This means that code generated for operations may be incorrect for the
underaligned user's objects, which can cause alignment violation crashes.
This was causing Cygwin and MinGW test failures.

For now, use the alignment requirement from the operations, even in
the lock-based mode. This increases alignment requirement unnecessarily,
because lock-based implementation could work with reduced alignment
storage. A better fix requires a different approach to storage type
generation. It will be done in a later commit.
2020-02-28 01:19:28 +03:00
Andrey Semashev
7966b114de Fixed possible unaligned access to expected value in compare_exchange.
Casting reference to value_type to reference to storage_type is not legal
if storage_type has a higher alignment requirements than value_type.
2020-02-27 00:10:27 +03:00
Andrey Semashev
2087c837ae Removed mismatched #pragma warning(pop).
Closes https://github.com/boostorg/atomic/issues/29.
2020-02-26 15:33:14 +03:00
Andrey Semashev
4336ac66bd Added support for C++20 atomic_flag::test operation.
The operation allows to test whether the flag is in the set state.
Also added tests and docs.
2020-02-26 01:24:54 +03:00
Andrey Semashev
87ee6b1c48 Rearranged includes of operations headers.
Atomic and atomic_ref implementation requires operations algorithms
to be fully defined, therefore include the full headers in the *_template
headers.
2020-02-26 01:10:32 +03:00
Andrey Semashev
1ea83f3ccc Removed includes of atomic_flag and fences from atomic/atomic.hpp.
Users are advised to either include the necessary headers explicitly
or include boost/atomic.hpp, which includes all library headers.
2020-02-26 01:02:37 +03:00
Andrey Semashev
502208b6c5 Removed checks for padding bits in generic atomic_ref specialization.
We currently don't support structs with padding bits, so the checks
are useless. Also, updated docs so that users are not given the idea
that structs with padding bits are supported.
2020-02-26 00:42:15 +03:00
Andrey Semashev
2ed311af18 Fixed wrong x86 code generated for bit_test_and_op for 8 and 16-bit atomics.
The implementation used to generate 32-bit bts/btr/btc for 8 and 16-bit
atomics, which could result in alignment and access violation and possibly
data corruption. 32 and 64-bit atomics are unaffected.

This commit fixes operaend width for 16-bit atomics. For 8-bit atomics the
generic implementation is used based on or/and/xor instructions since there
are no 8-bit bts/btr/btc.
2020-02-25 23:59:02 +03:00
Andrey Semashev
8b70628d91 Added compilation fixes for MSVC. 2020-02-25 17:09:22 +03:00
Andrey Semashev
b95c39d5e1 Removed clearing padding for class types on atomic_ref construction.
We currently don't support clearing internal padding in structures,
and we cannot detect tail padding in structures either. So for now there
is no point in the CAS loop during atomic_ref construction.
2020-02-25 02:24:49 +03:00
Andrey Semashev
904871c37d Implemented atomic_ref.
This commit adds C++20 atomic_ref implementation, documentation and tests.
2020-02-25 02:00:05 +03:00
Andrey Semashev
a2209fc2aa Ported to BOOST_INLINE_VARIABLE. 2019-10-29 21:26:12 +03:00
Andrey Semashev
d491c662a1 Removed redundant semicolon. 2019-10-14 00:00:13 +03:00
Andrey Semashev
282b4c2ca6 Added cmpxchg16b detection for clang-win. 2019-10-13 10:57:52 +03:00
Andrey Semashev
56bd60673a Added a workaround for __float128 not being considered a FP type by libstdc++-7. 2019-10-13 01:19:57 +03:00
Andrey Semashev
00455afcd1 Added compiler barrier macro for clang-win.
This should silence compiler warnings about _ReadWriteBarrier being
deprecated.
2019-10-12 16:51:28 +03:00
Andrey Semashev
19eecf893c Removed unused argument to silence compiler warnings.
Fixes https://github.com/boostorg/atomic/issues/16.
2018-07-30 12:10:48 +03:00
Andrey Semashev
6e14ca24da Removed clang-specific branch for x86 DCAS-based loads.
The storage to load from is const-qualified and DCAS via compiler intrinsics
require an unqualified pointer. Use asm implementation instead, which should be
as efficient as intrinsics, if not better, in this case.

Fixes https://github.com/boostorg/atomic/issues/15.
2018-07-17 12:37:29 +03:00
Andrey Semashev
406228d493 Made initializing constructor of atomic<> implicit.
This is an attempt to make boost::atomic<> interface closer to the standard. It
makes a difference in C++17 as it mandates copy elision, which makes this code
possible:

  boost::atomic<int> a = 10;

It also makes is_convertible<T, boost::atomic<T>> return true, which has
implications on the standard library components, such as std::pair.

This removes the workaround for gcc 4.7, which complains that
operator=(value_arg_type) is considered ambiguous with operator=(atomic const&)
in assignment expressions, even though conversion to atomic<> is less preferred
than conversion to value_arg_type. We try to work around the problem from the
operator= side.

Added a new compile test to check that the initializing constructor is implicit.
2018-02-20 01:39:52 +03:00
Andrey Semashev
9fd86de20b Silenced gcc warnings about unused parameter. 2018-02-18 14:00:16 +03:00
Andrey Semashev
7ce05c8ff0 Extended the workaround for noexcept in defaulted constructors to clang 3.1. 2018-02-15 15:46:31 +03:00
Andrey Semashev
35c87f5f6e Extended the workaround for noexcept in defaulted constructors to gcc 4.6. 2018-02-14 16:50:57 +03:00
Andrey Semashev
095812d84f Make the default constructor trivial if the user's type default constructor is.
This requires the is_trivially_default_constructible type trait, which is not
available in the older libstdc++ versions up to gcc 5.1. Thus the config macro
is updated to reflect the fact that Boost.Atomic now has more advanced needs.

Also, attempt to work around Intel compiler problem, which seems to break
(allegedly) because of the noexcept specifiers in the defaulted default
constructors. This may not be the cause, so this change will need to be tested.

Also, use value_arg_type consistently across different specializations of
basic_atomic.
2018-02-14 15:26:57 +03:00
Andrey Semashev
e7347a7d87 Use __builtin_addressof intrinsic where possible. 2018-02-14 03:34:56 +03:00
Andrey Semashev
92248dd5b8 Unified implementation of bitwise_fp_cast and bitwise_cast.
Also use memset to clear the tail padding of the storage as gcc generates
slightly better code for that.
2018-02-14 02:36:11 +03:00
Andrey Semashev
72309f41f9 Fixed CAS test failures for 80-bit long double.
The CAS implementation did not zero-fill the padding bits for the `expected`
argument, which caused CAS to fail sometimes.
2018-02-13 23:58:44 +03:00
Andrey Semashev
6dad4f3d21 Removed unused memset intrinsic macro. 2018-02-13 04:45:40 +03:00
Andrey Semashev
edef50f042 Added support for atomic floating point operations.
The support includes:

- The standard fetch_add/fetch_sub operations.
- Extra operations: (fetch_/opaque_)negate, (opaque_)add/sub.
- Extra capability macros: BOOST_ATOMIC_FLOAT/DOUBLE/LONG_DOUBLE_LOCK_FREE.

The atomic operations are currently implemented on top of the integer-based
backends and thus are mostly CAS-based. The CAS operations perform binary
comparisons, and as such have different behavior wrt. special FP values like
NaN and signed zero than normal C++.

The support for floating point types is optional and can be disabled by
defining BOOST_ATOMIC_NO_FLOATING_POINT. This can be useful if on a certain
platform parameters of the floating point types cannot be deduced from the
compiler-defined or system macros (in which case the compilation fails).

http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2017/p0020r6.html
2018-02-13 03:36:35 +03:00
Andrey Semashev
e751e235bc Silenced "unused parameter" warnings. 2018-02-12 17:53:57 +03:00
Andrey Semashev
8d7556f913 Added a specialized implementation of generic extra ops for CAS-based platforms.
This specialized implementation is able to save the result of the operations as
it is calculated in the CAS loop.
2018-02-11 01:57:16 +03:00
Andrey Semashev
92c57ac1e4 Added atomic operations that return the result of the operation.
These operations are useful for two reasons. First, they are needed by
atomic<> interface as the pre-increment/decrement and add/subtract operators
need to perform the corresponding arithmetics and return the actual result while
not exhibiting UB in case of overflow. This means that the operation must be
performed on the unsigned storage type in the backend. Second, the (op)_and_test
operations on ARM and PowerPC can be implemented in a more generic way on top of
the operations that return the result. And since we have those operations
internally, why not expose them to users.

Added tests and docs for the new operations. Also, added docs for the recently
added scoped names of the memory_order enum values.

Also, added a specialized "emulated" backend for the extra operations. This
backend makes better use of the fact that the operations are lock-protected
by avoiding any CAS-based loops.
2018-02-11 00:56:23 +03:00
Andrey Semashev
35497819a6 Microoptimization to reduce the number of branches in 128-bit operator==. 2018-02-10 17:19:03 +03:00
Andrey Semashev
8e7ea418ba Fixed a typo in the comment. 2018-02-04 23:50:10 +03:00
Andrey Semashev
233a2f72ba Switched integer storage type to be always an unsigned integer type.
The standard says that arithmetic operations on atomic types must always produce
a well-defined result in terms of two's complement arithmetic
([atomics.types.int]/7), which means integer owerflows are allowed and no trap
representations are allowed. This requires that all internal arithmetics be done
on unsigned integer types, even when the value type is a signed integer.

The implementation now casts between signed and unsigned integers internally,
performing zero or sign extension if the internal storage size is larger than
the stored value. This should have roughly the same performance as before,
although it mostly depends on the optimizer. The casting implementation
currently relies on that the signed integer representation is two's complement
on all supported platforms; other representations are not supported.
2018-02-04 23:42:50 +03:00
Andrey Semashev
64668130e9 Moved string op macros to a separate header. 2018-02-04 17:55:37 +03:00
Andrey Semashev
2a422ef2a9 Another attempt to work around MinGW gcc < 4.6 compilation failure.
The compiler complains:

error: can't find a register in class 'GENERAL_REGS' while reloading 'asm'

Try to work around it by explicitly specifying all registers to use.
2018-02-04 17:40:02 +03:00
Andrey Semashev
ff1e9747e6 Save/restore ebx for PIE code, just as well as for PIC. 2018-02-04 16:29:17 +03:00
Andrey Semashev
08486a7165 Reverted the previous change that gcc up to 4.6 don't support ax:dx pairs.
That change did not fix the compilers. The issue seems to be a bug specific to
MinGW gcc compilers up to 4.6, inclusively, and the cause of the problem is
yet unknown.
2018-02-04 15:39:05 +03:00
Andrey Semashev
acec1a7668 Simplified asm constraints to avoid comma-separated alternatives.
Alternatives are not supported by all compilers, and for the purpose we're using
them we can use constraint-local alternatives (i.e. "qm" instead of "q,m").
Additionally, this reduces duplication of other constraints in the asm block.
2018-02-04 15:24:31 +03:00
Andrey Semashev
fe57fa0375 Added specialized negate_and_test and complement_and_test for MSVC 32-bit x86 target. 2018-02-04 03:11:10 +03:00
Andrey Semashev
d1ea283a6b Only include hwcaps headers for the target architecture. 2018-02-04 02:56:27 +03:00
Andrey Semashev
9fd085c59f Added negate_and_test and complement_and_test ops.
As the names suggest, the methods perform the corresponding operation and test
if the result is not zero.

Also, for the emulated fetch_complement, take care of integral promotion, which
could mess up the storage bits that were not part of the value on backends
where the storage is larger than the value. This could in turn break CAS on
the atomic value as it compares the whole storage.
2018-02-04 00:13:27 +03:00
Andrey Semashev
ceadfbcea2 Use may_alias attribute to silence gcc warnings about breaking strict aliasing.
We need to mark the uint32_t and uint64_t that are used to load parts of the
double-width values into registers.
2018-02-03 23:20:39 +03:00
Andrey Semashev
9768684841 Added specialized implementation of (op)_and_test operations on PowerPC. 2018-02-03 22:31:50 +03:00
Andrey Semashev
5a04508961 Added specialized implementation of (op)_and_test operations on ARM. 2018-02-03 22:01:13 +03:00
Andrey Semashev
701b5c863b Updated copyright. 2018-02-03 21:49:00 +03:00
Andrey Semashev
5f80667cd3 Minor optimization. 2018-02-03 21:21:19 +03:00