4#ifndef QFUTEX_FREEBSD_P_H
5#define QFUTEX_FREEBSD_P_H
18#include <private/qcore_unix_p.h>
24#define QT_ALWAYS_USE_FUTEX
31template <
typename Atomic>
32inline int do_wait(Atomic &futex,
typename Atomic::Type expectedValue, _umtx_time *tmp =
nullptr)
37 int op = UMTX_OP_WAIT_UINT_PRIVATE;
38 if (
sizeof(futex) >
sizeof(
quint32))
42 void *uaddr =
reinterpret_cast<void *
>(tmp ?
sizeof(*tmp) : 0);
44 int ret = _umtx_op(&futex, op, u_long(expectedValue), uaddr, uaddr2);
49template <
typename Atomic>
50inline void futexWait(Atomic &futex,
typename Atomic::Type expectedValue)
55template <
typename Atomic>
58 struct _umtx_time tm = {};
61 tm._flags = UMTX_ABSTIME;
62 tm._clockid = CLOCK_MONOTONIC;
63 int r =
do_wait(futex, expectedValue, &tm);
64 return r == 0 || errno != ETIMEDOUT;
69 _umtx_op(&futex, UMTX_OP_WAKE_PRIVATE, 1,
nullptr,
nullptr);
74 _umtx_op(&futex, UMTX_OP_WAKE_PRIVATE, INT_MAX,
nullptr,
nullptr);
Combined button and popup list for selecting options.
void futexWakeAll(Atomic &futex)
void futexWait(Atomic &futex, typename Atomic::Type expectedValue)
void futexWakeOne(Atomic &futex)
int do_wait(Atomic &futex, typename Atomic::Type expectedValue, _umtx_time *tmp=nullptr)
constexpr bool futexAvailable()
timespec durationToTimespec(std::chrono::nanoseconds timeout) noexcept
QDeadlineTimer deadline(30s)