4#ifndef QOHOSMTBLOCKINGCALLSGATEWAY_H
5#define QOHOSMTBLOCKINGCALLSGATEWAY_H
18#include <QtCore/private/qohoscommon_p.h>
19#include <QtCore/qglobal.h>
21#include <condition_variable>
26#include <qohosplugincore.h>
33template<
typename SlaveContext>
46 QOhosConsumer<std::function<
void()>> masterThreadTasksExecutor,
47 QOhosConsumer<std::function<
void(SlaveContext &)>> slaveThreadTasksExecutor);
53 std::function<
void(SlaveContext &, QOhosTaskPromise<>)> &&task,
54 const std::string &callerContextName =
std::string());
60 struct MasterThreadTaskState
63 QOhosOptional<MasterThreadTaskResult> result;
64 std::condition_variable resultSetCondVar;
68 QOhosConsumer<std::function<
void()>> masterThreadTasksExecutor,
69 QOhosConsumer<std::function<
void(SlaveContext &)>> slaveThreadTasksExecutor);
71 QOhosConsumer<std::function<
void()>> m_masterThreadTasksExecutor;
72 QOhosConsumer<std::function<
void(SlaveContext &)>> m_slaveThreadTasksExecutor;
73 std::mutex m_waitStateMutex;
74 bool m_masterWaiting =
false;
75 std::shared_ptr<MasterThreadTaskState> m_masterThreadTaskState;
78template<
typename SlaveContext>
88template<
typename SlaveContext>
90 QOhosConsumer<std::function<
void()>> masterThreadTasksExecutor,
91 QOhosConsumer<std::function<
void(SlaveContext &)>> slaveThreadTasksExecutor)
92 : m_masterThreadTasksExecutor(std::move(masterThreadTasksExecutor))
93 , m_slaveThreadTasksExecutor(std::move(slaveThreadTasksExecutor))
97template<
typename SlaveContext>
100 m_masterThreadTasksExecutor(std::move(task));
103template<
typename SlaveContext>
106 m_slaveThreadTasksExecutor(std::move(task));
109template<
typename SlaveContext>
111 std::function<
void(SlaveContext &, QOhosTaskPromise<>)> &&task,
112 const std::string &callerContextName)
114 const auto funcInfo = Q_FUNC_INFO;
117 std::lock_guard<
std::mutex> waitStateLock(m_waitStateMutex);
118 if (m_masterThreadTaskState) {
119 auto taskState =
std::exchange(m_masterThreadTaskState,
nullptr);
121 taskState->resultSetCondVar.notify_all();
123 m_masterWaiting =
true;
126 auto taskFinishedPromise =
std::make_shared<
std::promise<
void>>();
127 auto taskFinishedFuture = taskFinishedPromise->get_future();
129 auto sharedTaskPromise = std::make_shared<QOhosTaskPromise<>>(
130 [taskFinishedPromise]() {
131 taskFinishedPromise->set_value();
133 [funcInfo, callerContextName]() {
134 qOhosReportFatalErrorAndAbort(
135 "%s: promise destroyed without notifying the caller: %s",
136 funcInfo, callerContextName.c_str());
141 [task =
std::move(task), sharedTaskPromise](SlaveContext &context) {
142 task(context,
std::move(*sharedTaskPromise));
144 taskFinishedFuture.wait();
147 std::lock_guard<
std::mutex> waitStateLock(m_waitStateMutex);
148 m_masterWaiting =
false;
152template<
typename SlaveContext>
JsState & jsState() const
virtual ~QAbilityEngine()
void invokeInSlaveThread(std::function< void(SlaveContext &)> &&task)
void runInSlaveThreadAndWaitForContinue(std::function< void(SlaveContext &, QOhosTaskPromise<>)> &&task, const std::string &callerContextName=std::string())
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 runInJsThreadAndWait(const std::function< void(JsState &)> &task, std::string callerContextName={})
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 invokeInJsThreadAndWaitForContinue(std::function< void(JsState &, QOhosTaskPromise<>)> &&task, std::string callerContextName={})
void addJsQAbilityPeer(std::shared_ptr< QAbilityPeer > qAbilityPeer)