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
qrhivaluemapper.cpp
Go to the documentation of this file.
1
// Copyright (C) 2024 The Qt Company Ltd.
2
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4
#
include
"qrhivaluemapper_p.h"
5
6
#
include
<
qmutex
.
h
>
7
#
include
<
rhi
/
qrhi
.
h
>
8
#
include
<
q20vector
.
h
>
9
10
#
include
<
vector
>
11
12
QT_BEGIN_NAMESPACE
13
14
// ensures thread-safe access to rhi cleanup handlers
15
class
QRhiCallback
::
Manager
:
public
std
::
enable_shared_from_this
<
Manager
>
16
{
17
using
CallbackList
=
std
::
vector
<
std
::
weak_ptr
<
QRhiCallback
>>;
18
struct
CallbacksItem
19
{
20
CallbackList callbacks;
21
size_t lastValidCallbackCount = 1u;
22
23
void
addCallback(
const
std
::weak_ptr<
QRhiCallback
> &cb)
24
{
25
Q_ASSERT(!cb.expired());
26
27
// check periodically to ensure avg O(1)
28
if
(callbacks.size() > lastValidCallbackCount * 2) {
29
q20
::erase_if(callbacks, [](
const
auto
&cb) {
30
return
cb.expired();
31
});
32
lastValidCallbackCount = callbacks.size() + 1;
33
}
34
35
callbacks.push_back(cb);
36
}
37
};
38
39
public
:
40
void
registerCallback
(QRhi &rhi,
const
std
::weak_ptr<
QRhiCallback
> &cb)
41
{
42
QMutexLocker
locker(&m_mutex);
43
auto
[rhiIt, added] = m_rhiToCallbackItems.try_emplace(&rhi, CallbacksItem{});
44
if
(added)
45
rhi.addCleanupCallback([instance = shared_from_this()](QRhi *rhi) {
46
for
(
auto
&weakCb : instance->extractCallbacks(rhi))
47
if
(
auto
cb = weakCb.lock())
48
cb->onRhiCleanup(*rhi);
// run outside the global mutex
49
});
50
51
rhiIt->second.addCallback(cb);
52
}
53
54
private
:
55
CallbackList extractCallbacks(QRhi *rhi)
56
{
57
QMutexLocker
locker(&m_mutex);
58
auto
it = m_rhiToCallbackItems.find(rhi);
59
Q_ASSERT(it != m_rhiToCallbackItems.end());
60
61
CallbackList result =
std
::move(it->second.callbacks);
62
m_rhiToCallbackItems.erase(it);
63
return
result;
64
}
65
66
private
:
67
std::unordered_map<QRhi *, CallbacksItem> m_rhiToCallbackItems;
68
QBasicMutex
m_mutex;
69
};
70
71
Q_GLOBAL_STATIC
(
std
::
shared_ptr
<
QRhiCallback
::
Manager
>,
rhiCallbacksStorage
,
72
std::make_shared<QRhiCallback::Manager>());
73
74
QRhiCallback
::QRhiCallback() : m_manager(*rhiCallbacksStorage) { }
75
76
QRhiCallback
::~QRhiCallback() =
default
;
// must be out-of-line
77
78
void
QRhiCallback
::registerCallback(QRhi &rhi)
79
{
80
m_manager->registerCallback(rhi, weak_from_this());
81
}
82
83
QT_END_NAMESPACE
QMutexLocker
\inmodule QtCore
Definition
qmutex.h:347
QRhiCallback::Manager
Definition
qrhivaluemapper.cpp:16
QRhiCallback::Manager::registerCallback
void registerCallback(QRhi &rhi, const std::weak_ptr< QRhiCallback > &cb)
Definition
qrhivaluemapper.cpp:40
QT_BEGIN_NAMESPACE
Combined button and popup list for selecting options.
Definition
qsequentialanimationgroup.cpp:47
q20
Definition
qnumeric.cpp:467
std
[33]
Definition
src_corelib_tools_qhash.cpp:421
QBasicMutex
QMutex QBasicMutex
Definition
qmutex.h:361
Q_GLOBAL_STATIC
Q_GLOBAL_STATIC(const QTzTimeZoneHash, tzZones, loadTzTimeZones())
qtmultimedia
src
multimedia
qrhivaluemapper.cpp
Generated on
for Qt by
1.18.0