2
0
mirror of https://github.com/boostorg/atomic.git synced 2026-01-19 04:02:09 +00:00

17 Commits

Author SHA1 Message Date
Andrey Semashev
1fa02d93f0 Removed BOOST_ATOMIC_NO_ATOMIC_FLAG_INIT macro definition.
Since the library now requires C++11, BOOST_ATOMIC_FLAG_INIT is always
supported.
2025-06-12 00:54:03 +03:00
Andrey Semashev
fc751f1db6 Retry notify_one_test if the second thread receives value2.
Occasionally, notify_one_test fails because the second thread receives
value2 instead of value3, even though the wakeup delay check passes.
This typically happens on one of the VM runners, so it is possible
there is some weird timing issue, when the thread gets woken up spuriously,
before the atomic value is updated, but the recorded wait time ends
up just above the expected waiting duration. Just retry the test
in this case.

Also use seq_cst in wait tests consistently instead of release on
stores and seq_cst on waits.
2025-06-11 04:36:52 +03:00
Andrey Semashev
8454d8a089 Replaced test_clock with std::chrono::steady_clock in tests.
This uses std::chrono::steady_clock universally in tests where monotonic
clock is needed. On Windows, hopefully this will resolve the time mismatches
between wakeups and externally measures times. Given that we use absolute
timeouts for sleeps, hopefully, this will also not reintroduce problems
that were originally worked around by test_clock.
2025-06-08 15:58:24 +03:00
Andrey Semashev
3a6abd10c1 Added tests for timed waiting operations. 2025-06-08 14:50:34 +03:00
Andrey Semashev
b36b040f3f Removed chrono workarounds for older compilers. 2025-06-08 04:37:51 +03:00
Andrey Semashev
bbe9234f8f Use absolute timeouts for sleeping in wait test helpers.
This may improve the precision of timing of thread wakeups.
2025-06-08 04:37:51 +03:00
Andrey Semashev
aebe9d585c Switched tests to std::thread and std::chrono.
This removes dependencies on Boost.Thread and Boost.Chrono, as well as
their dependencies and potentially allows to test more compilers. In particular,
this removes the dependency on Boost.Lexical cast, which no longer compiles
with gcc 4.6 and 4.7.
2023-09-03 22:11:23 +03:00
Andrey Semashev
f4037199b7 Removed names of unused parameters to silence warnings. 2021-10-27 12:04:07 +03:00
Andrey Semashev
ef4dedb031 Added tests for HAS_NATIVE_WAIT_NOTIFY macros and static constants. 2021-10-09 21:22:20 +03:00
Andrey Semashev
cbf5ae1ad2 Allocate IPC atomic objects in dynamic memory instead of the stack.
This works around spurious test failures on Mac OS as the notifying operation
sometimes fails with ENOENT. Presumably, the OS sometimes invalidates the
internal identification of the stack memory region, which makes __ulock_wake
fail to find the ulock object that other threads are blocked on.

By using dynamic memory we (hopefully) are using a location in a normal mapped
memory region that should not be mangled by the OS. Ideally, we would use
process-shared memory for this test, but that makes it more difficult to make
it portable and runnable in parallel. Dynamic local memory should do for now.
2021-09-26 19:54:01 +03:00
Andrey Semashev
fd2326cf4d Added a check in notify_one tests if the first thread wakes up too late.
In that case the first thread may receive the value3 instead of value2.
2020-06-24 14:53:27 +03:00
Andrey Semashev
0cf7964f78 Another workaround for IPC notify_one failures on Windows.
The previous change to increase the delay didn't help, so we're instead
changing the expectation - the first woken thread is allowed to receive
value3 on wake up.
2020-06-14 19:12:33 +03:00
Andrey Semashev
3de4c6c865 Increase delay between notifications in IPC notify_one test.
Occasionally, IPC notify_one test fails on Windows because the first
of the woken threads receives value3 from wait(). This is possible if
the thread lingers in wait() for some reason. Increase the delay
before the second notification slightly to reduce the likelihood
of this happening.
2020-06-14 18:10:30 +03:00
Andrey Semashev
3929919495 Implement a special test_clock for Windows.
The implementation uses GetTickCount/GetTickCount64 internally,
which is a steady and sufficiently low precision time source.

We need the clock to have relatively low precision so that wait
tests don't fail spuriously because the blocked threads wake up
too soon, according to more precise clocks.

boost::chrono::system_clock currently has an acceptably low precision,
but it is not a steady clock.
2020-06-12 13:32:32 +03:00
Andrey Semashev
72c87ca51b Use a lower resolution clock on Windows to reduce spurious test failures. 2020-06-12 03:24:29 +03:00
Andrey Semashev
1b8ec1700b Reworked IPC atomic tests to check for the is_always_lockfree property.
Checking for the capability macros is not good enough because ipc_atomic_ref
can be not lock-free even when the macro (and ipc_atomic) indicates lock-free.

We now check the is_always_lockfree property to decide whether to run or skip
tests for a given IPC atomic type.

Also, made struct_3_bytes output more informative.
2020-06-12 01:58:12 +03:00
Andrey Semashev
80cfbfd0de Added implementation of inter-process atomics.
The inter-process atomics have ipc_ prefixes: ipc_atomic, ipc_atomic_ref
and ipc_atomic_flag. These types are similar to their unprefixed counterparts
with the following distinctions:

- The operations are provided with an added precondition that is_lock_free()
  returns true.
- All operations, including waiting/notifying operations, are address-free,
  so the types are suitable for inter-process communication.
- The new has_native_wait_notify() operation and always_has_native_wait_notify
  static constant allow to test if the target platform has native support for
  address-free waiting/notifying operations. If it does not, a generic
  implementation is used based on a busy wait.
- The new set of capability macros added. The macros are named
  BOOST_ATOMIC_HAS_NATIVE_<T>_IPC_WAIT_NOTIFY and indicate whether address-free
  waiting/notifying operations are supported natively for a given type.

Additionally, to unify interface and implementation of different components,
the has_native_wait_notify() operation and always_has_native_wait_notify
static constant were added to non-IPC atomic types as well. Added
BOOST_ATOMIC_HAS_NATIVE_<T>_WAIT_NOTIFY capability macros to indicate
native support for inter-thread waiting/notifying operations.

Also, added is_lock_free() and is_always_lock_free to atomic_flag.

This commit adds implementation, docs and tests.
2020-06-11 13:07:16 +03:00