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
qohosmtblockingcallsgateway_p.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 QOHOSMTBLOCKINGCALLSGATEWAY_H
5#define QOHOSMTBLOCKINGCALLSGATEWAY_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QtCore/private/qohoscommon_p.h>
19#include <QtCore/qglobal.h>
20#include <chrono>
21#include <condition_variable>
22#include <functional>
23#include <future>
24#include <memory>
25#include <mutex>
26#include <qohosplugincore.h>
27#include <utility>
28
29QT_BEGIN_NAMESPACE
30
31namespace QtOhos {
32
33template<typename SlaveContext>
34class QOhosMtBlockingCallsGateway : public std::enable_shared_from_this<QOhosMtBlockingCallsGateway<SlaveContext>>
35{
36public:
44
45 static std::shared_ptr<QOhosMtBlockingCallsGateway<SlaveContext>> makeInstance(
46 QOhosConsumer<std::function<void()>> masterThreadTasksExecutor,
47 QOhosConsumer<std::function<void(SlaveContext &)>> slaveThreadTasksExecutor);
48
49 void invokeInMasterThread(std::function<void()> &&task);
50 void invokeInSlaveThread(std::function<void(SlaveContext &)> &&task);
51
53 QOhosConsumer<SlaveContext &, std::function<void()>> &&task);
55 QOhosConsumer<std::function<void()>> &&task,
57
58private:
59 struct MasterThreadTaskState
60 {
61 bool started = false;
63 std::condition_variable resultSetCondVar;
64 };
65
67 QOhosConsumer<std::function<void()>> masterThreadTasksExecutor,
68 QOhosConsumer<std::function<void(SlaveContext &)>> slaveThreadTasksExecutor);
69
70 QOhosConsumer<std::function<void()>> m_masterThreadTasksExecutor;
71 QOhosConsumer<std::function<void(SlaveContext &)>> m_slaveThreadTasksExecutor;
72 std::mutex m_waitStateMutex;
73 bool m_masterWaiting = false;
74 std::shared_ptr<MasterThreadTaskState> m_masterThreadTaskState;
75};
76
77template<typename SlaveContext>
86
87template<typename SlaveContext>
88QOhosMtBlockingCallsGateway<SlaveContext>::QOhosMtBlockingCallsGateway(
89 QOhosConsumer<std::function<void()>> masterThreadTasksExecutor,
90 QOhosConsumer<std::function<void(SlaveContext &)>> slaveThreadTasksExecutor)
91 : m_masterThreadTasksExecutor(std::move(masterThreadTasksExecutor))
92 , m_slaveThreadTasksExecutor(std::move(slaveThreadTasksExecutor))
93{
94}
95
96template<typename SlaveContext>
97void QOhosMtBlockingCallsGateway<SlaveContext>::invokeInMasterThread(std::function<void()> &&task)
98{
99 m_masterThreadTasksExecutor(std::move(task));
100}
101
102template<typename SlaveContext>
103void QOhosMtBlockingCallsGateway<SlaveContext>::invokeInSlaveThread(std::function<void(SlaveContext &)> &&task)
104{
105 m_slaveThreadTasksExecutor(std::move(task));
106}
107
108template<typename SlaveContext>
140
141template<typename SlaveContext>
143QOhosMtBlockingCallsGateway<SlaveContext>::tryInvokeInMasterThreadAndTryWaitForContinue(
144 QOhosConsumer<std::function<void()>> &&task,
146{
148
149 {
151 if (m_masterWaiting)
154 }
155
157
158 auto continueFunc = [weakSelf, taskState]() {
159 auto self = weakSelf.lock();
160 if (self) {
166 }
167 }
168 };
169
172 auto self = weakSelf.lock();
173 if (self) {
174 bool upToDate;
175 {
180 }
181 if (upToDate)
183 }
184 });
185
187 {
191 [&]() {
192 return taskState->result.hasValue();
193 });
198 }
199
200 return result;
201}
202
203}
204
205QT_END_NAMESPACE
206
207#endif
std::enable_if_t< qohosplugincore_h_detail::isQOhosOptional< QOhosInvokeResult< Func, T > >, QOhosInvokeResult< Func, T > > andThen(Func &&func) const
JsState & jsState() const
~JsState() override
void runInSlaveThreadAndWaitForContinue(QOhosConsumer< SlaveContext &, std::function< void()> > &&task)
void invokeInSlaveThread(std::function< void(SlaveContext &)> &&task)
static std::shared_ptr< QOhosMtBlockingCallsGateway< SlaveContext > > makeInstance(QOhosConsumer< std::function< void()> > masterThreadTasksExecutor, QOhosConsumer< std::function< void(SlaveContext &)> > slaveThreadTasksExecutor)
void invokeInMasterThread(std::function< void()> &&task)
void * tryCastWithTypeIdObject(const void *matchTypeIdObject) final
static std::shared_ptr< QUiAbilityPeer > tryCastFromQAbilityPeerOrNull(std::shared_ptr< QAbilityPeer > qAbilityPeer)
~QUiAbilityPeer() override
void invokeInJsThread(std::function< void(JsState &)> task)
void dispatchNewWant(QNapi::Object want, QNapi::Object launchParam)
void removeMatchingJsQAbilityPeer(QNapi::Object qAbility)
void initJsThreadState(napi_env env, std::map< std::string, QNapi::Reference< QNapi::Function > > &&jsModulesFactories, std::shared_ptr< AppFunctions > appFunctions, QtRunMode qtRunMode)
Q_REQUIRED_RESULT bool tryInvokeInQtThreadAndTryWaitForContinue(std::function< void(std::function< void()>)> &&task, std::chrono::nanoseconds timeout)
void runInJsThreadAndWait(const std::function< void(JsState &)> &task)
void invokeInJsThreadAndWaitForContinue(std::function< void(JsState &, std::function< void()>)> &&task)
void addJsQAbilityPeer(std::shared_ptr< QAbilityPeer > qAbilityPeer)