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_linux_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_LINUX_P_H
6
#
define
QFUTEX_LINUX_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
#
include
<
qtsan_impl
.
h
>
22
23
#
include
<
asm
/
unistd
.
h
>
24
#
include
<
errno
.
h
>
25
#
include
<
limits
.
h
>
26
#
include
<
linux
/
futex
.
h
>
27
#
include
<
sys
/
syscall
.
h
>
28
#
include
<
unistd
.
h
>
29
30
// RISC-V does not supply __NR_futex
31
#
ifndef
__NR_futex
32
#
define
__NR_futex
__NR_futex_time64
33
#
endif
34
35
#
define
QT_ALWAYS_USE_FUTEX
36
37
QT_BEGIN_NAMESPACE
38
39
namespace
QtLinuxFutex
{
40
constexpr
inline
bool
futexAvailable
() {
return
true
; }
41
42
inline
long
_q_futex
(
int
*addr,
int
op,
int
val, quintptr val2 = 0,
43
int
*addr2 =
nullptr
,
int
val3 = 0)
noexcept
44
{
45
QtTsan
::
futexRelease
(
addr
,
addr2
)
;
46
47
// we use __NR_futex because some libcs (like Android's bionic) don't
48
// provide SYS_futex etc.
49
long
result = syscall(
__NR_futex
, addr, op | FUTEX_PRIVATE_FLAG, val, val2, addr2, val3);
50
51
QtTsan
::
futexAcquire
(
addr
,
addr2
)
;
52
53
return
result;
54
}
55
template
<
typename
T>
int
*
addr
(T *ptr)
56
{
57
int
*int_addr =
reinterpret_cast
<
int
*>(ptr);
58
#
if
Q_BYTE_ORDER
==
Q_BIG_ENDIAN
59
if
(
sizeof
(T) >
sizeof
(
int
))
60
int_addr++;
//We want a pointer to the least significant half
61
#
endif
62
return
int_addr;
63
}
64
65
template
<
typename
Atomic>
66
inline
void
futexWait
(Atomic &futex,
typename
Atomic::Type expectedValue)
67
{
68
_q_futex(addr(&futex), FUTEX_WAIT, qintptr(expectedValue));
69
}
70
template
<
typename
Atomic>
71
inline
bool
futexWait
(Atomic &futex,
typename
Atomic::Type expectedValue, QDeadlineTimer deadline)
72
{
73
auto
timeout = deadline.deadline<
std
::chrono::steady_clock>().time_since_epoch();
74
struct
timespec ts = durationToTimespec(timeout);
75
long
r = _q_futex(addr(&futex), FUTEX_WAIT_BITSET, qintptr(expectedValue), quintptr(&ts),
76
nullptr
, FUTEX_BITSET_MATCH_ANY);
77
return
r == 0 || errno != ETIMEDOUT;
78
}
79
template
<
typename
Atomic>
inline
void
futexWakeOne
(Atomic &futex)
80
{
81
_q_futex(addr(&futex), FUTEX_WAKE, 1);
82
}
83
template
<
typename
Atomic>
inline
void
futexWakeAll
(Atomic &futex)
84
{
85
_q_futex(addr(&futex), FUTEX_WAKE, INT_MAX);
86
}
87
template
<
typename
Atomic>
inline
88
void
futexWakeOp
(Atomic &futex1,
int
wake1,
int
wake2, Atomic &futex2, quint32 op)
89
{
90
_q_futex(addr(&futex1), FUTEX_WAKE_OP, wake1, wake2, addr(&futex2), op);
91
}}
// namespace QtLinuxFutex
92
namespace
QtFutex =
QtLinuxFutex
;
93
94
QT_END_NAMESPACE
95
96
#
endif
// QFUTEX_LINUX_P_H
QtLinuxFutex
Definition
qfutex_linux_p.h:39
QtLinuxFutex::futexWakeOp
void futexWakeOp(Atomic &futex1, int wake1, int wake2, Atomic &futex2, quint32 op)
Definition
qfutex_linux_p.h:88
QtLinuxFutex::addr
int * addr(T *ptr)
Definition
qfutex_linux_p.h:55
QtLinuxFutex::futexWait
bool futexWait(Atomic &futex, typename Atomic::Type expectedValue, QDeadlineTimer deadline)
Definition
qfutex_linux_p.h:71
QtLinuxFutex::futexWait
void futexWait(Atomic &futex, typename Atomic::Type expectedValue)
Definition
qfutex_linux_p.h:66
QtLinuxFutex::futexWakeAll
void futexWakeAll(Atomic &futex)
Definition
qfutex_linux_p.h:83
QtLinuxFutex::futexAvailable
constexpr bool futexAvailable()
Definition
qfutex_linux_p.h:40
QtLinuxFutex::_q_futex
long _q_futex(int *addr, int op, int val, quintptr val2=0, int *addr2=nullptr, int val3=0) noexcept
Definition
qfutex_linux_p.h:42
QtLinuxFutex::futexWakeOne
void futexWakeOne(Atomic &futex)
Definition
qfutex_linux_p.h:79
QtTsan
Definition
qtsan_impl.h:18
QtTsan::futexRelease
void futexRelease(void *, void *=nullptr)
Definition
qtsan_impl.h:79
QtTsan::futexAcquire
void futexAcquire(void *, void *=nullptr)
Definition
qtsan_impl.h:78
std
[33]
Definition
src_corelib_tools_qhash.cpp:421
__NR_futex
#define __NR_futex
Definition
qfutex_linux_p.h:32
qtbase
src
corelib
thread
qfutex_linux_p.h
Generated on
for Qt by
1.18.0