Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Loading...
Searching...
No Matches
qohosbatchingrequestshandler.h
Go to the documentation of this file.
1// Copyright (C) 2025 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#ifndef QOHOSBATCHINGREQUESTSHANDLER_H
5#define QOHOSBATCHINGREQUESTSHANDLER_H
6
7#include <QtCore/QtGlobal>
8#include <QtCore/private/qohoscommon_p.h>
9#include <QtCore/qmetaobject.h>
10#include <QtCore/qobject.h>
11#include <functional>
12#include <memory>
13#include <mutex>
14#include <qohosplugincore.h>
15#include <utility>
16#include <vector>
17
19
21
22inline QOhosConsumer<std::function<void()>> makeQtThreadTasksExecutor(QtOhos::QObjectThreadSafeRef qtContext)
23{
24 return [qtContext](std::function<void()> task) {
25 qtContext.visitInQtThreadIfAlive(
26 [task = std::move(task)](auto &) {
27 task();
28 });
29 };
30}
31
32template<typename Batch>
34{
35public:
37 QOhosConsumer<std::function<void()>> tasksExecutor, std::function<void(Batch &&)> targetThreadHandleBatchFunc);
38
39 void updateBatch(const std::function<void(Batch &)> &updateFunc);
40
41private:
42 void postRequestTaskIfNeeded();
43
44 std::mutex m_batchMutex;
45 Batch m_batch = {};
46 bool m_batchPending = false;
47 QOhosConsumer<std::function<void()>> m_tasksExecutor;
48 std::function<void(Batch &&)> m_targetThreadHandleBatchFunc;
49};
50
51template<typename Batch>
52QtOhosBatchingAsyncMTRequestsHandler<Batch>::QtOhosBatchingAsyncMTRequestsHandler(
53 QOhosConsumer<std::function<void()>> tasksExecutor, std::function<void(Batch &&)> targetThreadHandleBatchFunc)
54 : m_tasksExecutor(tasksExecutor)
55 , m_targetThreadHandleBatchFunc(std::move(targetThreadHandleBatchFunc))
56{
57}
58
59template<typename Batch>
60void QtOhosBatchingAsyncMTRequestsHandler<Batch>::updateBatch(const std::function<void(Batch &)> &updateFunc)
61{
62 std::lock_guard<std::mutex> requestLock(m_batchMutex);
63
64 updateFunc(m_batch);
65
66 if (!m_batchPending) {
67 auto weakSelf = std::weak_ptr<QtOhosBatchingAsyncMTRequestsHandler<Batch>>(this->shared_from_this());
68 m_tasksExecutor(
69 [weakSelf]() {
70 auto self = weakSelf.lock();
71 if (self) {
72 std::unique_ptr<Batch> optRequest;
73 {
74 std::lock_guard<std::mutex> requestLock(self->m_batchMutex);
75 if (self->m_batchPending) {
76 optRequest = std::make_unique<Batch>(std::exchange(self->m_batch, Batch()));
77 self->m_batchPending = false;
78 }
79 }
80 if (optRequest)
81 self->m_targetThreadHandleBatchFunc(std::move(*optRequest));
82 }
83 });
84 m_batchPending = true;
85 }
86}
87
88}
89
90template<typename Request>
91std::function<void(std::function<void(Request &)>)> makeQtOhosBatchingMTRequestsHandler(
92 QOhosConsumer<std::function<void()>> tasksExecutor,
93 QOhosConsumer<Request &&> targetThreadBatchConsumer);
94
95template<typename QtRequest>
96std::function<void(std::function<void(QtRequest &)>)> makeQtOhosBatchingQtRequestsHandler(
97 QtOhos::QObjectThreadSafeRef qtContext, std::function<void(QtRequest &&)> qtHandleRequestFunc);
98
99template<typename QtRequest>
101 QtOhos::QObjectThreadSafeRef qtContext, QOhosConsumer<std::vector<QtRequest>> qtThreadBatchConsumer);
102
103template<typename Request>
105 QOhosConsumer<std::function<void()>> tasksExecutor,
106 QOhosConsumer<std::vector<Request>> targetThreadBatchConsumer);
107
108template<typename Request>
109std::function<void(std::function<void(Request &)>)> makeQtOhosBatchingMTRequestsHandler(
110 QOhosConsumer<std::function<void()>> tasksExecutor,
111 QOhosConsumer<Request &&> targetThreadBatchConsumer)
112{
114 auto requestsHandler = std::make_shared<QtOhosBatchingAsyncMTRequestsHandler<Request>>(
115 std::move(tasksExecutor), std::move(targetThreadBatchConsumer));
116 return [requestsHandler](const std::function<void(Request &)> &updateFunc) {
117 requestsHandler->updateBatch(updateFunc);
118 };
119}
120
121template<typename QtRequest>
122std::function<void(std::function<void(QtRequest &)>)> makeQtOhosBatchingQtRequestsHandler(
123 QtOhos::QObjectThreadSafeRef qtContext, std::function<void(QtRequest &&)> qtHandleRequestFunc)
124{
126 return makeQtOhosBatchingMTRequestsHandler(
127 makeQtThreadTasksExecutor(qtContext), std::move(qtHandleRequestFunc));
128}
129
130template<typename QtRequest>
132 QtOhos::QObjectThreadSafeRef qtContext, QOhosConsumer<std::vector<QtRequest>> qtThreadBatchConsumer)
133{
135 return makeQtOhosSimpleBatchingMTRequestsHandler(
136 makeQtThreadTasksExecutor(qtContext), std::move(qtThreadBatchConsumer));
137}
138
139template<typename Request>
141 QOhosConsumer<std::function<void()>> tasksExecutor,
142 QOhosConsumer<std::vector<Request>> targetThreadBatchConsumer)
143{
145 auto baseRequestsHandler = std::make_shared<QtOhosBatchingAsyncMTRequestsHandler<std::vector<Request>>>(
146 std::move(tasksExecutor), std::move(targetThreadBatchConsumer));
147 return [baseRequestsHandler = std::move(baseRequestsHandler)](Request request) {
148 baseRequestsHandler->updateBatch(
149 [&](std::vector<Request> &batch) {
150 batch.push_back(std::move(request));
151 });
152 };
153}
154
155QT_END_NAMESPACE
156
157#endif
std::function< void()> makeVSyncFrameRequester(::OHNativeWindow *nativeWindow, std::function< void()> vsyncFrameReadyFunc)
Definition vsync.cpp:157
Combined button and popup list for selecting options.
QOhosConsumer< std::function< void()> > makeQtThreadTasksExecutor(QtOhos::QObjectThreadSafeRef qtContext)
QOhosConsumer< QtRequest > makeQtOhosSimpleBatchingQtRequestsHandler(QtOhos::QObjectThreadSafeRef qtContext, QOhosConsumer< std::vector< QtRequest > > qtThreadBatchConsumer)
std::function< void(std::function< void(Request &)>)> makeQtOhosBatchingMTRequestsHandler(QOhosConsumer< std::function< void()> > tasksExecutor, QOhosConsumer< Request && > targetThreadBatchConsumer)
QOhosConsumer< Request > makeQtOhosSimpleBatchingMTRequestsHandler(QOhosConsumer< std::function< void()> > tasksExecutor, QOhosConsumer< std::vector< Request > > targetThreadBatchConsumer)
std::function< void(std::function< void(QtRequest &)>)> makeQtOhosBatchingQtRequestsHandler(QtOhos::QObjectThreadSafeRef qtContext, std::function< void(QtRequest &&)> qtHandleRequestFunc)
std::size_t operator()(const VsyncId &vsyncId) const noexcept
Definition vsync.cpp:165
QtOhos::TypedId< std::uintptr_t, struct VsyncIdTag > VsyncId
Definition vsync.cpp:19