Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
Loading...
Searching...
No Matches
qfutex_freebsd_p.h
Go to the documentation of this file.
1
// Copyright (C) 2023 Intel Corporation.
2
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
// Qt-Security score:significant reason:default
4
5
#
ifndef
QFUTEX_FREEBSD_P_H
6
#
define
QFUTEX_FREEBSD_P_H
7
8
//
9
// W A R N I N G
10
// -------------
11
//
12
// This file is not part of the Qt API. It exists purely as an
13
// implementation detail. This header file may change from version to
14
// version without notice, or even be removed.
15
//
16
// We mean it.
17
//
18
19
#
include
<
private
/
qcore_unix_p
.
h
>
20
#
include
<
qdeadlinetimer
.
h
>
21
22
// https://man.freebsd.org/cgi/man.cgi?query=_umtx_op
23
#
include
<
sys
/
umtx
.
h
>
24
25
#
define
QT_ALWAYS_USE_FUTEX
26
27
QT_BEGIN_NAMESPACE
28
29
namespace
QtFreeBSDFutex
{
30
constexpr
inline
bool
futexAvailable
() {
return
true
; }
31
32
template
<
typename
Atomic>
33
inline
int
do_wait
(Atomic &futex,
typename
Atomic::Type expectedValue, _umtx_time *tmp =
nullptr
)
34
{
35
// FreeBSD UMTX_OP_WAIT does not apply acquire or release memory barriers,
36
// so there are no QtTsan calls here.
37
38
int
op = UMTX_OP_WAIT_UINT_PRIVATE;
39
if
(
sizeof
(futex) >
sizeof
(quint32))
40
op = UMTX_OP_WAIT;
// no _PRIVATE version
41
42
// The timeout is passed in uaddr2, with its size in uaddr
43
void
*uaddr =
reinterpret_cast
<
void
*>(tmp ?
sizeof
(*tmp) : 0);
44
void
*uaddr2 = tmp;
45
int
ret = _umtx_op(&futex, op, u_long(expectedValue), uaddr, uaddr2);
46
47
return
ret;
48
}
49
50
template
<
typename
Atomic>
51
inline
void
futexWait
(Atomic &futex,
typename
Atomic::Type expectedValue)
52
{
53
do_wait(futex, expectedValue);
54
}
55
56
template
<
typename
Atomic>
57
inline
bool
futexWait
(Atomic &futex,
typename
Atomic::Type expectedValue, QDeadlineTimer timer)
58
{
59
struct
_umtx_time tm = {};
60
auto
deadline = timer.deadline<
std
::chrono::steady_clock>();
61
tm._timeout = durationToTimespec(deadline.time_since_epoch());
62
tm._flags = UMTX_ABSTIME;
63
tm._clockid = CLOCK_MONOTONIC;
64
int
r = do_wait(futex, expectedValue, &tm);
65
return
r == 0 || errno != ETIMEDOUT;
66
}
67
68
template
<
typename
Atomic>
inline
void
futexWakeOne
(Atomic &futex)
69
{
70
_umtx_op(&futex, UMTX_OP_WAKE_PRIVATE, 1,
nullptr
,
nullptr
);
71
}
72
73
template
<
typename
Atomic>
inline
void
futexWakeAll
(Atomic &futex)
74
{
75
_umtx_op(&futex, UMTX_OP_WAKE_PRIVATE, INT_MAX,
nullptr
,
nullptr
);
76
}
77
}
//namespace QtFreeBSDFutex
78
79
namespace
QtFutex =
QtFreeBSDFutex
;
80
81
QT_END_NAMESPACE
82
83
#
endif
// QFUTEX_FREEBSD_P_H
QtFreeBSDFutex
Definition
qfutex_freebsd_p.h:29
QtFreeBSDFutex::futexWait
bool futexWait(Atomic &futex, typename Atomic::Type expectedValue, QDeadlineTimer timer)
Definition
qfutex_freebsd_p.h:57
QtFreeBSDFutex::futexWakeAll
void futexWakeAll(Atomic &futex)
Definition
qfutex_freebsd_p.h:73
QtFreeBSDFutex::futexWait
void futexWait(Atomic &futex, typename Atomic::Type expectedValue)
Definition
qfutex_freebsd_p.h:51
QtFreeBSDFutex::futexWakeOne
void futexWakeOne(Atomic &futex)
Definition
qfutex_freebsd_p.h:68
QtFreeBSDFutex::do_wait
int do_wait(Atomic &futex, typename Atomic::Type expectedValue, _umtx_time *tmp=nullptr)
Definition
qfutex_freebsd_p.h:33
QtFreeBSDFutex::futexAvailable
constexpr bool futexAvailable()
Definition
qfutex_freebsd_p.h:30
std
[33]
Definition
src_corelib_tools_qhash.cpp:421
qtbase
src
corelib
thread
qfutex_freebsd_p.h
Generated on
for Qt by
1.18.0