// SPDX-License-Identifier: BSD-3-Clause // Copyright (c) 2014-2020, The Monero Project. #ifndef FUTURE_SCHEDULER_H #define FUTURE_SCHEDULER_H #include #include #include //#include #include #include #include #include class FutureScheduler : public QObject { Q_OBJECT public: FutureScheduler(QObject *parent); ~FutureScheduler(); void shutdownWaitForFinished() noexcept; QPair> run(std::function function) noexcept; // QPair> run(std::function function, const QJSValue &callback); bool stopping() const noexcept; private: bool add() noexcept; void done() noexcept; template QPair> execute(std::function(QFutureWatcher *)> makeFuture) noexcept { if (add()) { try { auto *watcher = new QFutureWatcher(); connect(watcher, &QFutureWatcher::finished, [watcher] { watcher->deleteLater(); }); watcher->setFuture(makeFuture(watcher)); return qMakePair(true, watcher->future()); } catch (const std::exception &exception) { qCritical() << "Failed to schedule async function: " << exception.what(); done(); } } return qMakePair(false, QFuture()); } QFutureWatcher schedule(std::function function); //QFutureWatcher schedule(std::function function, const QJSValue &callback); private: size_t Alive; QWaitCondition Condition; QMutex Mutex; std::atomic Stopping; }; #endif // FUTURE_SCHEDULER_H