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/qglobal.h>
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 <vector>
16
18
20
21inline QOhosConsumer<std::function<void()>> makeQtThreadTasksExecutor(QtOhos::QObjectThreadSafeRef qtContext)
22{
23 return [qtContext](std::function<void()> task) {
24 qtContext.visitInQtThreadIfAlive(
25 [task = std::move(task)](auto &) {
26 task();
27 });
28 };
29}
30
31template<typename Batch>
33{
34public:
36 QOhosConsumer<std::function<void()>> tasksExecutor, std::function<void(Batch &&)> targetThreadHandleBatchFunc);
37
38 void updateBatch(const std::function<void(Batch &)> &updateFunc);
39
40private:
41 void postRequestTaskIfNeeded();
42
43 std::mutex m_batchMutex;
44 Batch m_batch = {};
45 bool m_batchPending = false;
46 QOhosConsumer<std::function<void()>> m_tasksExecutor;
47 std::function<void(Batch &&)> m_targetThreadHandleBatchFunc;
48};
49
50template<typename Batch>
51QtOhosBatchingAsyncMTRequestsHandler<Batch>::QtOhosBatchingAsyncMTRequestsHandler(
52 QOhosConsumer<std::function<void()>> tasksExecutor, std::function<void(Batch &&)> targetThreadHandleBatchFunc)
53 : m_tasksExecutor(tasksExecutor)
54 , m_targetThreadHandleBatchFunc(std::move(targetThreadHandleBatchFunc))
55{
56}
57
58template<typename Batch>
59void QtOhosBatchingAsyncMTRequestsHandler<Batch>::updateBatch(const std::function<void(Batch &)> &updateFunc)
60{
61 std::lock_guard<std::mutex> requestLock(m_batchMutex);
62
63 updateFunc(m_batch);
64
65 if (!m_batchPending) {
66 auto weakSelf = std::weak_ptr<QtOhosBatchingAsyncMTRequestsHandler<Batch>>(this->shared_from_this());
67 m_tasksExecutor(
68 [weakSelf]() {
69 auto self = weakSelf.lock();
70 if (self) {
71 std::unique_ptr<Batch> optRequest;
72 {
73 std::lock_guard<std::mutex> requestLock(self->m_batchMutex);
74 if (self->m_batchPending) {
75 optRequest = std::make_unique<Batch>(std::exchange(self->m_batch, Batch()));
76 self->m_batchPending = false;
77 }
78 }
79 if (optRequest)
80 self->m_targetThreadHandleBatchFunc(std::move(*optRequest));
81 }
82 });
83 m_batchPending = true;
84 }
85}
86
87}
88
89template<typename Request>
90std::function<void(std::function<void(Request &)>)> makeQtOhosBatchingMTRequestsHandler(
91 QOhosConsumer<std::function<void()>> tasksExecutor,
92 QOhosConsumer<Request &&> targetThreadBatchConsumer);
93
94template<typename QtRequest>
95std::function<void(std::function<void(QtRequest &)>)> makeQtOhosBatchingQtRequestsHandler(
96 QtOhos::QObjectThreadSafeRef qtContext, std::function<void(QtRequest &&)> qtHandleRequestFunc);
97
98template<typename QtRequest>
100 QtOhos::QObjectThreadSafeRef qtContext, QOhosConsumer<std::vector<QtRequest>> qtThreadBatchConsumer);
101
102template<typename Request>
104 QOhosConsumer<std::function<void()>> tasksExecutor,
105 QOhosConsumer<std::vector<Request>> targetThreadBatchConsumer);
106
107template<typename Request>
108std::function<void(std::function<void(Request &)>)> makeQtOhosBatchingMTRequestsHandler(
109 QOhosConsumer<std::function<void()>> tasksExecutor,
110 QOhosConsumer<Request &&> targetThreadBatchConsumer)
111{
113 auto requestsHandler = std::make_shared<QtOhosBatchingAsyncMTRequestsHandler<Request>>(
114 std::move(tasksExecutor), std::move(targetThreadBatchConsumer));
115 return [requestsHandler](const std::function<void(Request &)> &updateFunc) {
116 requestsHandler->updateBatch(updateFunc);
117 };
118}
119
120template<typename QtRequest>
121std::function<void(std::function<void(QtRequest &)>)> makeQtOhosBatchingQtRequestsHandler(
122 QtOhos::QObjectThreadSafeRef qtContext, std::function<void(QtRequest &&)> qtHandleRequestFunc)
123{
125 return makeQtOhosBatchingMTRequestsHandler(
126 makeQtThreadTasksExecutor(qtContext), std::move(qtHandleRequestFunc));
127}
128
129template<typename QtRequest>
131 QtOhos::QObjectThreadSafeRef qtContext, QOhosConsumer<std::vector<QtRequest>> qtThreadBatchConsumer)
132{
134 return makeQtOhosSimpleBatchingMTRequestsHandler(
135 makeQtThreadTasksExecutor(qtContext), std::move(qtThreadBatchConsumer));
136}
137
138template<typename Request>
140 QOhosConsumer<std::function<void()>> tasksExecutor,
141 QOhosConsumer<std::vector<Request>> targetThreadBatchConsumer)
142{
144 auto baseRequestsHandler = std::make_shared<QtOhosBatchingAsyncMTRequestsHandler<std::vector<Request>>>(
145 std::move(tasksExecutor), std::move(targetThreadBatchConsumer));
146 return [baseRequestsHandler = std::move(baseRequestsHandler)](Request request) {
147 baseRequestsHandler->updateBatch(
148 [&](std::vector<Request> &batch) {
149 batch.push_back(std::move(request));
150 });
151 };
152}
153
154QT_END_NAMESPACE
155
156#endif
std::function< void()> makeVSyncFrameRequester(::OHNativeWindow *nativeWindow, std::function< void()> vsyncFrameReadyFunc)
Definition vsync.cpp:156
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:164
QtOhos::TypedId< std::uintptr_t, struct VsyncIdTag > VsyncId
Definition vsync.cpp:18