Introduce centralized means of checking for asyncify
The new function has an advantage of not requring EM_JS. Change-Id: Ib9ad0e6b59cfe2e6864697a14b5cfdb39f62af2d Reviewed-by: David Skoland <david.skoland@qt.io> Reviewed-by: Morten Johan Sørvig <morten.sorvig@qt.io>
This commit is contained in:
parent
20ae1cd486
commit
b1b61636b3
@ -7,6 +7,7 @@
|
|||||||
#include <QtCore/qcoreapplication.h>
|
#include <QtCore/qcoreapplication.h>
|
||||||
#include <QtCore/qthread.h>
|
#include <QtCore/qthread.h>
|
||||||
#include <QtCore/qsocketnotifier.h>
|
#include <QtCore/qsocketnotifier.h>
|
||||||
|
#include <QtCore/private/qstdweb_p.h>
|
||||||
|
|
||||||
#include "emscripten.h"
|
#include "emscripten.h"
|
||||||
#include <emscripten/html5.h>
|
#include <emscripten/html5.h>
|
||||||
@ -34,9 +35,10 @@ static bool g_is_asyncify_suspended = false;
|
|||||||
|
|
||||||
#if defined(QT_STATIC)
|
#if defined(QT_STATIC)
|
||||||
|
|
||||||
EM_JS(bool, qt_have_asyncify_js, (), {
|
static bool useAsyncify()
|
||||||
return typeof Asyncify != "undefined";
|
{
|
||||||
});
|
return qstdweb::haveAsyncify();
|
||||||
|
}
|
||||||
|
|
||||||
EM_JS(void, qt_asyncify_suspend_js, (), {
|
EM_JS(void, qt_asyncify_suspend_js, (), {
|
||||||
let sleepFn = (wakeUp) => {
|
let sleepFn = (wakeUp) => {
|
||||||
@ -60,7 +62,7 @@ EM_JS(void, qt_asyncify_resume_js, (), {
|
|||||||
|
|
||||||
// EM_JS is not supported for side modules; disable asyncify
|
// EM_JS is not supported for side modules; disable asyncify
|
||||||
|
|
||||||
bool qt_have_asyncify_js()
|
static bool useAsyncify()
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@ -77,15 +79,6 @@ void qt_asyncify_resume_js()
|
|||||||
|
|
||||||
#endif // defined(QT_STATIC)
|
#endif // defined(QT_STATIC)
|
||||||
|
|
||||||
// Returns true if asyncify is available.
|
|
||||||
bool qt_have_asyncify()
|
|
||||||
{
|
|
||||||
static bool have_asyncify = []{
|
|
||||||
return qt_have_asyncify_js();
|
|
||||||
}();
|
|
||||||
return have_asyncify;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Suspends the main thread until qt_asyncify_resume() is called. Returns
|
// Suspends the main thread until qt_asyncify_resume() is called. Returns
|
||||||
// false immediately if Qt has already suspended the main thread (recursive
|
// false immediately if Qt has already suspended the main thread (recursive
|
||||||
// suspend is not supported by Emscripten). Returns true (after resuming),
|
// suspend is not supported by Emscripten). Returns true (after resuming),
|
||||||
@ -391,7 +384,7 @@ void QEventDispatcherWasm::handleApplicationExec()
|
|||||||
|
|
||||||
void QEventDispatcherWasm::handleDialogExec()
|
void QEventDispatcherWasm::handleDialogExec()
|
||||||
{
|
{
|
||||||
if (!qt_have_asyncify()) {
|
if (!useAsyncify()) {
|
||||||
qWarning() << "Warning: exec() is not supported on Qt for WebAssembly in this configuration. Please build"
|
qWarning() << "Warning: exec() is not supported on Qt for WebAssembly in this configuration. Please build"
|
||||||
<< "with asyncify support, or use an asynchronous API like QDialog::open()";
|
<< "with asyncify support, or use an asynchronous API like QDialog::open()";
|
||||||
emscripten_sleep(1); // This call never returns
|
emscripten_sleep(1); // This call never returns
|
||||||
@ -420,7 +413,7 @@ bool QEventDispatcherWasm::wait(int timeout)
|
|||||||
#endif
|
#endif
|
||||||
Q_ASSERT(emscripten_is_main_runtime_thread());
|
Q_ASSERT(emscripten_is_main_runtime_thread());
|
||||||
Q_ASSERT(isMainThreadEventDispatcher());
|
Q_ASSERT(isMainThreadEventDispatcher());
|
||||||
if (qt_have_asyncify()) {
|
if (useAsyncify()) {
|
||||||
if (timeout > 0)
|
if (timeout > 0)
|
||||||
qWarning() << "QEventDispatcherWasm asyncify wait with timeout is not supported; timeout will be ignored"; // FIXME
|
qWarning() << "QEventDispatcherWasm asyncify wait with timeout is not supported; timeout will be ignored"; // FIXME
|
||||||
|
|
||||||
|
@ -667,6 +667,12 @@ namespace Promise {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool haveAsyncify()
|
||||||
|
{
|
||||||
|
static bool HaveAsyncify = !emscripten::val::global("Asyncify").isUndefined();
|
||||||
|
return HaveAsyncify;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace qstdweb
|
} // namespace qstdweb
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
@ -189,6 +189,8 @@ namespace qstdweb {
|
|||||||
static emscripten::val savedWindow = emscripten::val::global("window");
|
static emscripten::val savedWindow = emscripten::val::global("window");
|
||||||
return savedWindow;
|
return savedWindow;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool haveAsyncify();
|
||||||
}
|
}
|
||||||
|
|
||||||
QT_END_NAMESPACE
|
QT_END_NAMESPACE
|
||||||
|
@ -7,6 +7,7 @@ qt_internal_add_manual_test(eventloop_auto
|
|||||||
../../qtwasmtestlib/qtwasmtestlib.cpp
|
../../qtwasmtestlib/qtwasmtestlib.cpp
|
||||||
LIBRARIES
|
LIBRARIES
|
||||||
Qt::Core
|
Qt::Core
|
||||||
|
Qt::CorePrivate
|
||||||
)
|
)
|
||||||
|
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
@ -28,6 +29,7 @@ qt_internal_add_manual_test(eventloop_auto_asyncify
|
|||||||
../../qtwasmtestlib/qtwasmtestlib.cpp
|
../../qtwasmtestlib/qtwasmtestlib.cpp
|
||||||
LIBRARIES
|
LIBRARIES
|
||||||
Qt::Core
|
Qt::Core
|
||||||
|
Qt::CorePrivate
|
||||||
)
|
)
|
||||||
|
|
||||||
target_link_options(eventloop_auto_asyncify PRIVATE -sASYNCIFY -Os)
|
target_link_options(eventloop_auto_asyncify PRIVATE -sASYNCIFY -Os)
|
||||||
|
@ -7,6 +7,7 @@
|
|||||||
#include <QtCore/QObject>
|
#include <QtCore/QObject>
|
||||||
#include <QtCore/QThread>
|
#include <QtCore/QThread>
|
||||||
#include <QtCore/QTimer>
|
#include <QtCore/QTimer>
|
||||||
|
#include <QtCore/private/qstdweb_p.h>
|
||||||
|
|
||||||
#include <qtwasmtestlib.h>
|
#include <qtwasmtestlib.h>
|
||||||
|
|
||||||
@ -14,10 +15,6 @@
|
|||||||
|
|
||||||
const int timerTimeout = 10;
|
const int timerTimeout = 10;
|
||||||
|
|
||||||
EM_JS(bool, have_asyncify, (), {
|
|
||||||
return typeof Asyncify != "undefined";
|
|
||||||
});
|
|
||||||
|
|
||||||
class WasmEventDispatcherTest: public QObject
|
class WasmEventDispatcherTest: public QObject
|
||||||
{
|
{
|
||||||
Q_OBJECT
|
Q_OBJECT
|
||||||
@ -242,7 +239,7 @@ void WasmEventDispatcherTest::timerSecondaryThread()
|
|||||||
// Post an event to the main thread and asyncify wait for it
|
// Post an event to the main thread and asyncify wait for it
|
||||||
void WasmEventDispatcherTest::postEventAsyncify()
|
void WasmEventDispatcherTest::postEventAsyncify()
|
||||||
{
|
{
|
||||||
if (!have_asyncify()) {
|
if (!qstdweb::haveAsyncify()) {
|
||||||
QtWasmTest::completeTestFunction(QtWasmTest::TestResult::Skip, "requires asyncify");
|
QtWasmTest::completeTestFunction(QtWasmTest::TestResult::Skip, "requires asyncify");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -259,7 +256,7 @@ void WasmEventDispatcherTest::postEventAsyncify()
|
|||||||
// Create a timer on the main thread and asyncify wait for it
|
// Create a timer on the main thread and asyncify wait for it
|
||||||
void WasmEventDispatcherTest::timerAsyncify()
|
void WasmEventDispatcherTest::timerAsyncify()
|
||||||
{
|
{
|
||||||
if (!have_asyncify()) {
|
if (!qstdweb::haveAsyncify()) {
|
||||||
QtWasmTest::completeTestFunction(QtWasmTest::TestResult::Skip, "requires asyncify");
|
QtWasmTest::completeTestFunction(QtWasmTest::TestResult::Skip, "requires asyncify");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -276,7 +273,7 @@ void WasmEventDispatcherTest::timerAsyncify()
|
|||||||
// Asyncify wait in a loop
|
// Asyncify wait in a loop
|
||||||
void WasmEventDispatcherTest::postEventAsyncifyLoop()
|
void WasmEventDispatcherTest::postEventAsyncifyLoop()
|
||||||
{
|
{
|
||||||
if (!have_asyncify()) {
|
if (!qstdweb::haveAsyncify()) {
|
||||||
QtWasmTest::completeTestFunction(QtWasmTest::TestResult::Skip, "requires asyncify");
|
QtWasmTest::completeTestFunction(QtWasmTest::TestResult::Skip, "requires asyncify");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@ -296,7 +293,7 @@ void WasmEventDispatcherTest::postEventAsyncifyLoop()
|
|||||||
// Asyncify wait for QThread::wait() / pthread_join()
|
// Asyncify wait for QThread::wait() / pthread_join()
|
||||||
void WasmEventDispatcherTest::threadAsyncifyWait()
|
void WasmEventDispatcherTest::threadAsyncifyWait()
|
||||||
{
|
{
|
||||||
if (!have_asyncify())
|
if (!qstdweb::haveAsyncify())
|
||||||
QtWasmTest::completeTestFunction(QtWasmTest::TestResult::Skip, "requires asyncify");
|
QtWasmTest::completeTestFunction(QtWasmTest::TestResult::Skip, "requires asyncify");
|
||||||
|
|
||||||
const int threadCount = 15;
|
const int threadCount = 15;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user