From b1ed39a12e05221005d9ee2100ee23ee2c007ce3 Mon Sep 17 00:00:00 2001 From: Tianyu Chen Date: Wed, 27 Dec 2023 17:02:08 +0800 Subject: [PATCH 1/2] feat: update qcoro to 0.10.0-1 --- .git-blame-ignore-revs | 2 + .gitignore | 12 + CMakeLists.txt | 17 +- cmake/AddQCoroLibrary.cmake | 10 +- debian/changelog | 8 +- debian/control | 3 +- debian/libqcoro5core0.symbols | 35 +- debian/libqcoro6core0.symbols | 37 +- debian/libqcoro6network0.symbols | 2 +- debian/libqcoro6qml0.symbols | 2 +- debian/libqcoro6websockets0.symbols | 2 +- docker/Dockerfile.gcc | 8 +- docs/changelog.md | 18 +- .../2023-12-05-qcoro-0.10.0-announcement.md | 109 +++++ docs/reference/test/index.md | 2 + docs/release-checklist.md | 17 + qcoro/CMakeLists.txt | 7 + qcoro/core/CMakeLists.txt | 2 + qcoro/core/impl/isqprivatesignal.h | 84 ++++ qcoro/core/qcorosignal.h | 120 ++++-- qcoro/core/qcorothread.cpp | 2 + qcoro/coroutine.h | 3 +- qcoro/impl/connect.h | 61 +++ qcoro/impl/task.h | 150 +++++++ qcoro/impl/taskawaiterbase.h | 30 ++ qcoro/impl/taskfinalsuspend.h | 40 ++ qcoro/impl/taskpromise.h | 86 ++++ qcoro/impl/taskpromisebase.h | 61 +++ qcoro/impl/waitfor.h | 105 +++++ qcoro/qcoroasyncgenerator.h | 9 +- qcoro/qcorotask.h | 372 +++--------------- qcoro/test/qcorotest.h | 14 +- qcoro/websockets/qcorowebsocket.cpp | 8 +- requirements.txt | 4 +- tests/qcoroasyncgenerator.cpp | 34 +- tests/qcorosignal.cpp | 90 +++++ tests/qcorotask.cpp | 27 ++ 37 files changed, 1187 insertions(+), 406 deletions(-) create mode 100644 .git-blame-ignore-revs create mode 100644 .gitignore create mode 100644 docs/news/2023/2023-12-05-qcoro-0.10.0-announcement.md create mode 100644 docs/release-checklist.md create mode 100644 qcoro/core/impl/isqprivatesignal.h create mode 100644 qcoro/impl/connect.h create mode 100644 qcoro/impl/task.h create mode 100644 qcoro/impl/taskawaiterbase.h create mode 100644 qcoro/impl/taskfinalsuspend.h create mode 100644 qcoro/impl/taskpromise.h create mode 100644 qcoro/impl/taskpromisebase.h create mode 100644 qcoro/impl/waitfor.h diff --git a/.git-blame-ignore-revs b/.git-blame-ignore-revs new file mode 100644 index 0000000..2e505b8 --- /dev/null +++ b/.git-blame-ignore-revs @@ -0,0 +1,2 @@ +# Initial run of clang-format +0c01ca40fd8bd337ecae3ea21be1e5a97ba40e4b diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..c0c34c6 --- /dev/null +++ b/.gitignore @@ -0,0 +1,12 @@ +build/ +build-*/ +.*.swp +.ccls-cache +compile_commands.json +/.vs +/.vscode +/CMakeSettings.json + +# Python (from mkdocs) +__pycache__ +venv diff --git a/CMakeLists.txt b/CMakeLists.txt index 84b29ce..2b8d68c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -1,5 +1,5 @@ cmake_minimum_required(VERSION 3.18.4) -set(qcoro_VERSION 0.9.0) +set(qcoro_VERSION 0.10.0) set(qcoro_SOVERSION 0) project(qcoro LANGUAGES CXX VERSION ${qcoro_VERSION}) @@ -105,7 +105,10 @@ if (MSVC) set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /W4 /WX") # Disable warning C5054: "operator '&': deprecated between enumerations of different types" caused by QtWidgets/qsizepolicy.h # Disable warning C4127: "conditional expression is constant" caused by QtCore/qiterable.h - set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd5054 /wd4127") + if ("${QT_VERSION_MAJOR}" STREQUAL "6" AND "${Qt6_VERSION}" VERSION_GREATER_EQUAL "6.4.0" AND "${Qt6_VERSION}" VERSION_LESS "6.5.3") + # Disable warning C4702: "unreachable code" caused by QtTest/qtestcase.h - fixed in Qt 6.5.3 + set(CMAKE_CXX_FLAGS_DEBUG "${CMAKE_CXX_FLAGS_DEBUG} /wd5054 /wd4127 /wd4702") + endif() if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") # Explicitly enable exceptions support for clang-cl (it's only enabled by CMake when targeting the Windows-MSVC platform, @@ -120,6 +123,7 @@ endif() if (QCORO_ENABLE_ASAN) if (MSVC) set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /INCREMENTAL:NO") + set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} /INCREMENTAL:NO") if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fsanitize=address") else() @@ -162,6 +166,15 @@ add_code_coverage_all_targets(EXCLUDE "${CMAKE_BINARY_DIR}" tests/utils/*) # Definitions #-----------------------------------------------------------# +# debug suffixes for qmake compatibility +if(WIN32) + set(CMAKE_DEBUG_POSTFIX "d") +elseif(APPLE) + set(CMAKE_DEBUG_POSTFIX "_debug") +else() + set(CMAKE_DEBUG_POSTFIX "") +endif() + set(QCORO_TARGET_PREFIX "QCoro${QT_VERSION_MAJOR}") set(QCORO_INSTALL_INCLUDEDIR "${CMAKE_INSTALL_INCLUDEDIR}/qcoro${QT_VERSION_MAJOR}") diff --git a/cmake/AddQCoroLibrary.cmake b/cmake/AddQCoroLibrary.cmake index 356faa2..6399e75 100644 --- a/cmake/AddQCoroLibrary.cmake +++ b/cmake/AddQCoroLibrary.cmake @@ -178,10 +178,18 @@ function(add_qcoro_library) EXPORT ${target_name}Targets ) install( - FILES ${source_HEADERS} ${LIB_HEADERS} + FILES ${source_HEADERS} DESTINATION ${QCORO_INSTALL_INCLUDEDIR}/qcoro/ COMPONENT Devel ) + foreach(lib_header ${LIB_HEADERS}) + get_filename_component(header_prefix_dir ${lib_header} DIRECTORY) + install( + FILES ${lib_header} + DESTINATION ${QCORO_INSTALL_INCLUDEDIR}/qcoro/${header_prefix_dir} + COMPONENT Devel + ) + endforeach() install( FILES ${camelcase_HEADERS} DESTINATION ${QCORO_INSTALL_INCLUDEDIR}/QCoro/ diff --git a/debian/changelog b/debian/changelog index 09eb05f..85cbeb1 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,8 +1,10 @@ -qcoro (0.9.0-2) unstable; urgency=medium +qcoro (0.10.0-1) unstable; urgency=medium - * Remove libqt6opengl6-dev dependency. + * Team upload. + * New upstream release. + * Update symbols files. - -- Wang Zichong Tue, 31 Oct 2023 16:16:00 +0800 + -- Pino Toscano Wed, 06 Dec 2023 22:35:12 +0100 qcoro (0.9.0-1) unstable; urgency=medium diff --git a/debian/control b/debian/control index 1377014..c934064 100644 --- a/debian/control +++ b/debian/control @@ -7,7 +7,8 @@ Build-Depends: cmake (>= 3.18.4~), dbus-x11 , debhelper-compat (= 13), libqt5websockets5-dev (>= 5.15.0~), - qt6-websockets-dev, + libqt6opengl6-dev, + libqt6websockets6-dev (>= 6.2.0~), pkg-kde-tools, qml-module-qtquick-controls , qml6-module-qtqml-workerscript , diff --git a/debian/libqcoro5core0.symbols b/debian/libqcoro5core0.symbols index 2a8d546..bab010b 100644 --- a/debian/libqcoro5core0.symbols +++ b/debian/libqcoro5core0.symbols @@ -1,4 +1,4 @@ -# SymbolsHelper-Confirmed: 0.9.0 amd64 i386 +# SymbolsHelper-Confirmed: 0.10.0 amd64 i386 libQCoro5Core.so.0 libqcoro5core0 #MINVER# * Build-Depends-Package: qcoro-qt5-dev _ZGVZN9QtPrivate15ConnectionTypesINS_4ListIJiN8QProcess10ExitStatusEEEELb1EE5typesEvE1t@Base 0.5.0 @@ -20,14 +20,18 @@ libQCoro5Core.so.0 libqcoro5core0 #MINVER# _ZN5QCoro13ThreadContextD2Ev@Base 0.8.0 (optional=templinst)_ZN5QCoro4TaskI10QByteArrayED1Ev@Base 0.5.0 (optional=templinst)_ZN5QCoro4TaskI10QByteArrayED2Ev@Base 0.5.0 - (optional=templinst)_ZN5QCoro4TaskIN6QTimer14QPrivateSignalEED1Ev@Base 0.5.0 - (optional=templinst)_ZN5QCoro4TaskIN6QTimer14QPrivateSignalEED2Ev@Base 0.5.0 - (optional=templinst)_ZN5QCoro4TaskISt8optionalIN6QTimer14QPrivateSignalEEED1Ev@Base 0.5.0 - (optional=templinst)_ZN5QCoro4TaskISt8optionalIN6QTimer14QPrivateSignalEEED2Ev@Base 0.5.0 - (optional=templinst)_ZN5QCoro4TaskISt8optionalIN7QThread14QPrivateSignalEEED1Ev@Base 0.5.0 - (optional=templinst)_ZN5QCoro4TaskISt8optionalIN7QThread14QPrivateSignalEEED2Ev@Base 0.5.0 - (optional=templinst)_ZN5QCoro4TaskISt8optionalIN8QProcess14QPrivateSignalEEED1Ev@Base 0.5.0 - (optional=templinst)_ZN5QCoro4TaskISt8optionalIN8QProcess14QPrivateSignalEEED2Ev@Base 0.5.0 +#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskIN6QTimer14QPrivateSignalEED1Ev@Base 0.5.0 +#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskIN6QTimer14QPrivateSignalEED2Ev@Base 0.5.0 + (optional=templinst)_ZN5QCoro4TaskISt5tupleIJEEED1Ev@Base 0.10.0 + (optional=templinst)_ZN5QCoro4TaskISt5tupleIJEEED2Ev@Base 0.10.0 +#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskISt8optionalIN6QTimer14QPrivateSignalEEED1Ev@Base 0.5.0 +#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskISt8optionalIN6QTimer14QPrivateSignalEEED2Ev@Base 0.5.0 +#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskISt8optionalIN7QThread14QPrivateSignalEEED1Ev@Base 0.5.0 +#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskISt8optionalIN7QThread14QPrivateSignalEEED2Ev@Base 0.5.0 +#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskISt8optionalIN8QProcess14QPrivateSignalEEED1Ev@Base 0.5.0 +#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskISt8optionalIN8QProcess14QPrivateSignalEEED2Ev@Base 0.5.0 + (optional=templinst)_ZN5QCoro4TaskISt8optionalISt5tupleIJEEEED1Ev@Base 0.10.0 + (optional=templinst)_ZN5QCoro4TaskISt8optionalISt5tupleIJEEEED2Ev@Base 0.10.0 (optional=templinst)_ZN5QCoro4TaskISt8optionalISt5tupleIJiN8QProcess10ExitStatusEEEEED1Ev@Base 0.5.0 (optional=templinst)_ZN5QCoro4TaskISt8optionalISt5tupleIJiN8QProcess10ExitStatusEEEEED2Ev@Base 0.5.0 (optional=templinst)_ZN5QCoro4TaskISt8optionalIbEED1Ev@Base 0.5.0 @@ -49,10 +53,12 @@ libQCoro5Core.so.0 libqcoro5core0 #MINVER# _ZN5QCoro6detail11QCoroThreadC1EP7QThread@Base 0.5.0 _ZN5QCoro6detail11QCoroThreadC2EP7QThread@Base 0.5.0 (optional=templinst)_ZN5QCoro6detail11TaskPromiseI10QByteArrayE19unhandled_exceptionEv@Base 0.5.0 - (optional=templinst)_ZN5QCoro6detail11TaskPromiseIN6QTimer14QPrivateSignalEE19unhandled_exceptionEv@Base 0.5.0 - (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalIN6QTimer14QPrivateSignalEEE19unhandled_exceptionEv@Base 0.5.0 - (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalIN7QThread14QPrivateSignalEEE19unhandled_exceptionEv@Base 0.5.0 - (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalIN8QProcess14QPrivateSignalEEE19unhandled_exceptionEv@Base 0.5.0 +#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro6detail11TaskPromiseIN6QTimer14QPrivateSignalEE19unhandled_exceptionEv@Base 0.5.0 + (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt5tupleIJEEE19unhandled_exceptionEv@Base 0.10.0 +#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalIN6QTimer14QPrivateSignalEEE19unhandled_exceptionEv@Base 0.5.0 +#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalIN7QThread14QPrivateSignalEEE19unhandled_exceptionEv@Base 0.5.0 +#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalIN8QProcess14QPrivateSignalEEE19unhandled_exceptionEv@Base 0.5.0 + (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalISt5tupleIJEEEE19unhandled_exceptionEv@Base 0.10.0 (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalISt5tupleIJiN8QProcess10ExitStatusEEEEE19unhandled_exceptionEv@Base 0.5.0 (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalIbEE19unhandled_exceptionEv@Base 0.5.0 (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalIxEE19unhandled_exceptionEv@Base 0.5.0 @@ -166,7 +172,8 @@ libQCoro5Core.so.0 libqcoro5core0 #MINVER# _ZNSt19bad_optional_accessD1Ev@Base 0.5.0 _ZNSt19bad_optional_accessD2Ev@Base 0.5.0 (optional=templinst)_ZNSt8__detail9__variant16_Variant_storageILb0EJSt9monostate10QByteArrayNSt15__exception_ptr13exception_ptrEEE8_M_resetEv@Base 0.5.0 - (optional=templinst)_ZNSt8__detail9__variant16_Variant_storageILb0EJSt9monostateSt8optionalIN7QThread14QPrivateSignalEENSt15__exception_ptr13exception_ptrEEE8_M_resetEv@Base 0.5.0 +#MISSING: 0.10.0# (optional=templinst)_ZNSt8__detail9__variant16_Variant_storageILb0EJSt9monostateSt8optionalIN7QThread14QPrivateSignalEENSt15__exception_ptr13exception_ptrEEE8_M_resetEv@Base 0.5.0 + (optional=templinst)_ZNSt8__detail9__variant16_Variant_storageILb0EJSt9monostateSt8optionalISt5tupleIJEEENSt15__exception_ptr13exception_ptrEEE8_M_resetEv@Base 0.10.0 (optional=templinst)_ZNSt8__detail9__variant16_Variant_storageILb0EJSt9monostateSt8optionalIbENSt15__exception_ptr13exception_ptrEEE8_M_resetEv@Base 0.5.0 (optional=templinst)_ZNSt8__detail9__variant16_Variant_storageILb0EJSt9monostateSt8optionalIxENSt15__exception_ptr13exception_ptrEEE8_M_resetEv@Base 0.5.0 (optional=templinst)_ZNSt8__detail9__variant16_Variant_storageILb0EJSt9monostatebNSt15__exception_ptr13exception_ptrEEE8_M_resetEv@Base 0.5.0 diff --git a/debian/libqcoro6core0.symbols b/debian/libqcoro6core0.symbols index 34da574..58fd864 100644 --- a/debian/libqcoro6core0.symbols +++ b/debian/libqcoro6core0.symbols @@ -1,4 +1,4 @@ -# SymbolsHelper-Confirmed: 0.9.0 amd64 i386 +# SymbolsHelper-Confirmed: 0.10.0 amd64 i386 libQCoro6Core.so.0 libqcoro6core0 #MINVER# * Build-Depends-Package: qcoro-qt6-dev (optional=templinst)_Z41qRegisterNormalizedMetaTypeImplementationIN8QProcess10ExitStatusEEiRK10QByteArray@Base 0.7.0 @@ -21,14 +21,18 @@ libQCoro6Core.so.0 libqcoro6core0 #MINVER# _ZN5QCoro13ThreadContextD2Ev@Base 0.8.0 (optional=templinst)_ZN5QCoro4TaskI10QByteArrayED1Ev@Base 0.5.0 (optional=templinst)_ZN5QCoro4TaskI10QByteArrayED2Ev@Base 0.5.0 - (optional=templinst)_ZN5QCoro4TaskIN6QTimer14QPrivateSignalEED1Ev@Base 0.5.0 - (optional=templinst)_ZN5QCoro4TaskIN6QTimer14QPrivateSignalEED2Ev@Base 0.5.0 - (optional=templinst)_ZN5QCoro4TaskISt8optionalIN6QTimer14QPrivateSignalEEED1Ev@Base 0.5.0 - (optional=templinst)_ZN5QCoro4TaskISt8optionalIN6QTimer14QPrivateSignalEEED2Ev@Base 0.5.0 - (optional=templinst)_ZN5QCoro4TaskISt8optionalIN7QThread14QPrivateSignalEEED1Ev@Base 0.5.0 - (optional=templinst)_ZN5QCoro4TaskISt8optionalIN7QThread14QPrivateSignalEEED2Ev@Base 0.5.0 - (optional=templinst)_ZN5QCoro4TaskISt8optionalIN8QProcess14QPrivateSignalEEED1Ev@Base 0.5.0 - (optional=templinst)_ZN5QCoro4TaskISt8optionalIN8QProcess14QPrivateSignalEEED2Ev@Base 0.5.0 +#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskIN6QTimer14QPrivateSignalEED1Ev@Base 0.5.0 +#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskIN6QTimer14QPrivateSignalEED2Ev@Base 0.5.0 + (optional=templinst)_ZN5QCoro4TaskISt5tupleIJEEED1Ev@Base 0.10.0 + (optional=templinst)_ZN5QCoro4TaskISt5tupleIJEEED2Ev@Base 0.10.0 +#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskISt8optionalIN6QTimer14QPrivateSignalEEED1Ev@Base 0.5.0 +#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskISt8optionalIN6QTimer14QPrivateSignalEEED2Ev@Base 0.5.0 +#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskISt8optionalIN7QThread14QPrivateSignalEEED1Ev@Base 0.5.0 +#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskISt8optionalIN7QThread14QPrivateSignalEEED2Ev@Base 0.5.0 +#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskISt8optionalIN8QProcess14QPrivateSignalEEED1Ev@Base 0.5.0 +#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskISt8optionalIN8QProcess14QPrivateSignalEEED2Ev@Base 0.5.0 + (optional=templinst)_ZN5QCoro4TaskISt8optionalISt5tupleIJEEEED1Ev@Base 0.10.0 + (optional=templinst)_ZN5QCoro4TaskISt8optionalISt5tupleIJEEEED2Ev@Base 0.10.0 (optional=templinst)_ZN5QCoro4TaskISt8optionalISt5tupleIJiN8QProcess10ExitStatusEEEEED1Ev@Base 0.5.0 (optional=templinst)_ZN5QCoro4TaskISt8optionalISt5tupleIJiN8QProcess10ExitStatusEEEEED2Ev@Base 0.5.0 (optional=templinst)_ZN5QCoro4TaskISt8optionalIbEED1Ev@Base 0.5.0 @@ -50,10 +54,12 @@ libQCoro6Core.so.0 libqcoro6core0 #MINVER# _ZN5QCoro6detail11QCoroThreadC1EP7QThread@Base 0.5.0 _ZN5QCoro6detail11QCoroThreadC2EP7QThread@Base 0.5.0 (optional=templinst)_ZN5QCoro6detail11TaskPromiseI10QByteArrayE19unhandled_exceptionEv@Base 0.5.0 - (optional=templinst)_ZN5QCoro6detail11TaskPromiseIN6QTimer14QPrivateSignalEE19unhandled_exceptionEv@Base 0.5.0 - (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalIN6QTimer14QPrivateSignalEEE19unhandled_exceptionEv@Base 0.5.0 - (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalIN7QThread14QPrivateSignalEEE19unhandled_exceptionEv@Base 0.5.0 - (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalIN8QProcess14QPrivateSignalEEE19unhandled_exceptionEv@Base 0.5.0 +#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro6detail11TaskPromiseIN6QTimer14QPrivateSignalEE19unhandled_exceptionEv@Base 0.5.0 + (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt5tupleIJEEE19unhandled_exceptionEv@Base 0.10.0 +#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalIN6QTimer14QPrivateSignalEEE19unhandled_exceptionEv@Base 0.5.0 +#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalIN7QThread14QPrivateSignalEEE19unhandled_exceptionEv@Base 0.5.0 +#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalIN8QProcess14QPrivateSignalEEE19unhandled_exceptionEv@Base 0.5.0 + (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalISt5tupleIJEEEE19unhandled_exceptionEv@Base 0.10.0 (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalISt5tupleIJiN8QProcess10ExitStatusEEEEE19unhandled_exceptionEv@Base 0.5.0 (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalIbEE19unhandled_exceptionEv@Base 0.5.0 (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalIxEE19unhandled_exceptionEv@Base 0.5.0 @@ -168,7 +174,7 @@ libQCoro6Core.so.0 libqcoro6core0 #MINVER# #MISSING: 0.9.0# (optional=templinst)_ZN9QtPrivate26QDataStreamOperatorForTypeIbLb1EE13dataStreamOutEPKNS_18QMetaTypeInterfaceER11QDataStreamPKv@Base 0.5.0 #MISSING: 0.9.0# (optional=templinst)_ZN9QtPrivate26QDataStreamOperatorForTypeIxLb1EE12dataStreamInEPKNS_18QMetaTypeInterfaceER11QDataStreamPv@Base 0.5.0 #MISSING: 0.9.0# (optional=templinst)_ZN9QtPrivate26QDataStreamOperatorForTypeIxLb1EE13dataStreamOutEPKNS_18QMetaTypeInterfaceER11QDataStreamPKv@Base 0.5.0 - (optional=templinst)_ZN9QtPrivate27QDebugStreamOperatorForTypeIN8QProcess10ExitStatusELb1EE11debugStreamEPKNS_18QMetaTypeInterfaceER6QDebugPKv@Base 0.5.0 +#MISSING: 0.10.0# (optional=templinst)_ZN9QtPrivate27QDebugStreamOperatorForTypeIN8QProcess10ExitStatusELb1EE11debugStreamEPKNS_18QMetaTypeInterfaceER6QDebugPKv@Base 0.5.0 _ZNK5QCoro13ThreadContext11await_readyEv@Base 0.8.0 _ZNK5QCoro6detail10QCoroTimer14waitForTimeoutEv@Base 0.4.0 _ZNK5QCoro6detail10QCoroTimer23WaitForTimeoutOperation11await_readyEv@Base 0.4.0 @@ -189,7 +195,8 @@ libQCoro6Core.so.0 libqcoro6core0 #MINVER# _ZNSt19bad_optional_accessD1Ev@Base 0.5.0 _ZNSt19bad_optional_accessD2Ev@Base 0.5.0 (optional=templinst)_ZNSt8__detail9__variant16_Variant_storageILb0EJSt9monostate10QByteArrayNSt15__exception_ptr13exception_ptrEEE8_M_resetEv@Base 0.5.0 - (optional=templinst)_ZNSt8__detail9__variant16_Variant_storageILb0EJSt9monostateSt8optionalIN7QThread14QPrivateSignalEENSt15__exception_ptr13exception_ptrEEE8_M_resetEv@Base 0.5.0 +#MISSING: 0.10.0# (optional=templinst)_ZNSt8__detail9__variant16_Variant_storageILb0EJSt9monostateSt8optionalIN7QThread14QPrivateSignalEENSt15__exception_ptr13exception_ptrEEE8_M_resetEv@Base 0.5.0 + (optional=templinst)_ZNSt8__detail9__variant16_Variant_storageILb0EJSt9monostateSt8optionalISt5tupleIJEEENSt15__exception_ptr13exception_ptrEEE8_M_resetEv@Base 0.10.0 (optional=templinst)_ZNSt8__detail9__variant16_Variant_storageILb0EJSt9monostateSt8optionalIbENSt15__exception_ptr13exception_ptrEEE8_M_resetEv@Base 0.5.0 (optional=templinst)_ZNSt8__detail9__variant16_Variant_storageILb0EJSt9monostateSt8optionalIxENSt15__exception_ptr13exception_ptrEEE8_M_resetEv@Base 0.5.0 (optional=templinst)_ZNSt8__detail9__variant16_Variant_storageILb0EJSt9monostatebNSt15__exception_ptr13exception_ptrEEE8_M_resetEv@Base 0.5.0 diff --git a/debian/libqcoro6network0.symbols b/debian/libqcoro6network0.symbols index bef3240..f75270d 100644 --- a/debian/libqcoro6network0.symbols +++ b/debian/libqcoro6network0.symbols @@ -1,4 +1,4 @@ -# SymbolsHelper-Confirmed: 0.9.0 amd64 i386 +# SymbolsHelper-Confirmed: 0.10.0 amd64 i386 libQCoro6Network.so.0 libqcoro6network0 #MINVER# * Build-Depends-Package: qcoro-qt6-dev #MISSING: 0.9.0# (optional=templinst)_ZN12QMetaTypeId2IbE11nameAsArrayE@Base 0.5.0 diff --git a/debian/libqcoro6qml0.symbols b/debian/libqcoro6qml0.symbols index 46fa71a..446060a 100644 --- a/debian/libqcoro6qml0.symbols +++ b/debian/libqcoro6qml0.symbols @@ -1,4 +1,4 @@ -# SymbolsHelper-Confirmed: 0.9.0 amd64 i386 +# SymbolsHelper-Confirmed: 0.10.0 amd64 i386 libQCoro6Qml.so.0 libqcoro6qml0 #MINVER# * Build-Depends-Package: qcoro-qt6-dev (optional=templinst)_Z41qRegisterNormalizedMetaTypeImplementationI8QJSValueEiRK10QByteArray@Base 0.7.0 diff --git a/debian/libqcoro6websockets0.symbols b/debian/libqcoro6websockets0.symbols index 46a9136..504270e 100644 --- a/debian/libqcoro6websockets0.symbols +++ b/debian/libqcoro6websockets0.symbols @@ -1,4 +1,4 @@ -# SymbolsHelper-Confirmed: 0.9.0 amd64 i386 +# SymbolsHelper-Confirmed: 0.10.0 amd64 i386 libQCoro6WebSockets.so.0 libqcoro6websockets0 #MINVER# * Build-Depends-Package: qcoro-qt6-dev (optional=templinst)_Z41qRegisterNormalizedMetaTypeImplementationIP10QWebSocketEiRK10QByteArray@Base 0.7.0 diff --git a/docker/Dockerfile.gcc b/docker/Dockerfile.gcc index ae4ac3e..1d336f7 100644 --- a/docker/Dockerfile.gcc +++ b/docker/Dockerfile.gcc @@ -21,12 +21,12 @@ RUN source /etc/os-release && \ RUN apt-get update \ && apt-get upgrade --yes \ && apt-get install --yes --no-install-recommends \ - cmake=3.18.4\* cmake-data=3.18.4\* \ + cmake cmake-data \ python3-pip python3-setuptools python3-wheel python3-dev \ dbus dbus-x11 \ libglib2.0-dev libxkbcommon-dev libfreetype6-dev libfontconfig1-dev \ libssl-dev \ - libegl-dev libgl-dev libegl1=1.3.2\* libgl1=1.3.2\* libglx0=1.3.2\* libglvnd0=1.3.2\* \ + libegl-dev libgl-dev libegl1 libgl1 libglx0 libglvnd0 \ libvulkan-dev \ && apt-get clean @@ -36,7 +36,9 @@ RUN ln -s x86_64-linux-gnu /usr/lib/x86_64-unknown-linux-gnu # Install Qt WORKDIR /root -RUN pip3 install aqtinstall +# Necessary to allow using pip on newer images (--break-system-packages doesn't work on older images) +RUN rm -f /usr/lib/python$(python3 --version | grep -oE "3.[0-9]+")/EXTERNALLY-MANAGED \ + && pip3 install aqtinstall COPY install-qt.sh ./install-qt.sh RUN ./install-qt.sh "${qt_version}" "${qt_modules}" "${qt_archives}" diff --git a/docs/changelog.md b/docs/changelog.md index 3e2728d..5ac4f0e 100644 --- a/docs/changelog.md +++ b/docs/changelog.md @@ -10,18 +10,31 @@ SPDX-License-Identifier: GFDL-1.3-or-later # Changelog +## 0.10.0 (2023-12-05) + +* [Release announcement](news/2023/2023-12-05-qcoro-0.10.0-announcement.md) +* [Github release changelog](https://github.com/danvratil/qcoro/releases/tag/v0.10.0) + +## 0.9.0 (2023-04-27) + +* [Release announcement](news/2023/2023-04-27-qcoro-0.9.0-announcement.md) +* [Github release changelog](https://github.com/danvratil/qcoro/releases/tag/v0.9.0) + +## 0.8.0 (2023-01-31) + +* [Release announcement](news/2023/2023-01-31-qcoro-0.8.0-announcement.md) +* [Github release changelog](https://github.com/danvratil/qcoro/releases/tag/v0.8.0) + ## 0.7.0 (2022-11-20) * [Release announcement](news/2022/2022-11-17-qcoro-0.7.0-announcement.md) * [Github release changelog](https://github.com/danvratil/qcoro/releases/tag/v0.7.0) - ## 0.6.0 (2022-07-09) * [Release announcement](news/2022/2022-07-09-qcoro-0.6.0-announcement.md) * [Github release changelog](https://github.com/danvratil/qcoro/releases/tag/v0.6.0) - ## 0.5.1 (2022-04-27) * [Github release changelog](https://github.com/danvratil/qcoro/releases/tag/v0.5.1) @@ -31,7 +44,6 @@ SPDX-License-Identifier: GFDL-1.3-or-later * [Release announcement](news/2022/2022-04-25-qcoro-0.5.0-announcement.md) * [Github release changelog](https://github.com/danvratil/qcoro/releases/tag/v0.5.0) - ## 0.4.0 (2022-01-06) * [Release announcement](news/2022/2022-01-06-qcoro-0.4.0-announcement.md) diff --git a/docs/news/2023/2023-12-05-qcoro-0.10.0-announcement.md b/docs/news/2023/2023-12-05-qcoro-0.10.0-announcement.md new file mode 100644 index 0000000..417ca2b --- /dev/null +++ b/docs/news/2023/2023-12-05-qcoro-0.10.0-announcement.md @@ -0,0 +1,109 @@ +--- +title: QCoro 0.10.0 Release Announcement +date: "2023-12-05" +description: > + Improved signal/slots features and compatibility and bug fixes. +--- + + + +# QCoro 0.10.0 Release Announcement + +Thank you to everyone who reported issues and contributed to QCoro. +Your help is much appreciated! + +## Support for awaiting Qt signals with QPrivateSignal + +Qt has a feature where signals can be made "private" (in the sense that only class +that defines the signal can emit it) by appending `QPrivateSignal` argument to the +signal method: + +```cpp +class MyObject : public QObject { + Q_OBJECT +... +Q_SIGNALS: + void error(int code, const QString &message, QPrivateSignal); +}; +``` + +`QPrivateSignal` is a type that is defined inside the `Q_OBJECT` macro, so it's +private and as such only `MyObject` class can emit the signal, since only `MyObject` +can instantiate `QPrivateSignal`: + +```cpp +void MyObject::handleError(int code, const QString &message) +{ + Q_EMIT error(code, message, QPrivateSignal{}); +} +``` + +QCoro has a feature that makes it possible to `co_await` a signal emission and +returns the signals arguments as a tuple: + +```cpp + +MyObject myObject; +const auto [code, message] = co_await qCoro(&myObject, &MyObject::handleError); +``` + +While it was possible to `co_await` a "private" signal previously, it would get +return the `QPrivateSignal` value as an additional value in the result tuple +and on some occasions would not compile at all. + +In QCoro 0.10, we can detect the `QPrivateSignal` argument and drop it inside QCoro +so that it does not cause trouble and does not clutter the result type. + +Achieving this wasn't simple, as it's not really possible to detect the type (because +it's private), e.g. code like this would fail to compile, because we are not allowed +to refer to `Obj::QPrivateSignal`, since that type is private to `Obj`. + +```cpp +template +constexpr bool is_qprivatesignal = std::same_as_v; +``` + +After many different attempts we ended up abusing `__PRETTY_FUNCTION__` +(and `__FUNCSIG__` on MSVC) and checking whether the function's name contains +`QPrivateSignal` string in the expected location. It's a whacky hack, but hey - if it +works, it's not stupid :). And thanks to improvements in compile-time evaluation in +C++20, the check is evaluated completely at compile-time, so there's no runtime +overhead of obtaining current source location and doing string comparisons. + +## Source Code Reorganization (again!) + +Big part of QCoro are template classes, so there's a lot of code in headers. In my +opinion, some of the files (especially qcorotask.h) were getting hard to read and +navigate and it made it harder to just see the API of the class (like you get +with non-template classes), which is what users of a library are usually most +interested in. + +Therefore I decided to move definitions into separated files, so that they don't +clutter the main include files. + +This change is completely source- and binary-compatible, so QCoro users don't have +to make any changes to their code. The only difference is that the main QCoro +headers are much prettier to look at now. + +## Bugfixes + +* `QCoro::waitFor()` now re-throws exceptions ([#172][issue172], Daniel Vrátil) +* Replaced deprecated `QWebSocket::error` with `QWbSocket::errorOccured` in QCoroWebSockets module ([#174][pr174], Marius P) +* Fix `QCoro::connect()` not working with lambdas ([#179][pr179], Johan Brüchert) +* Fix library name postfix for qmake compatibilty ([#192][pr192], Shantanu Tushar) +* Fix `std::coroutine_traits isn't a class template` error with LLVM 16 ([#196][pr196], Rafael Sadowski) + +## Full changelog + +[See changelog on Github](https://github.com/danvratil/qcoro/releases/tag/v0.10.0) + +[issue172]: https://github.com/danvratil/qcoro/issues/172 +[pr174]: https://github.com/danvratil/qcoro/pulls/174 +[pr179]: https://github.com/danvratil/qcoro/pulls/179 +[pr192]: https://github.com/danvratil/qcoro/pulls/192 +[pr196]: https://github.com/danvratil/qcoro/pulls/196 + diff --git a/docs/reference/test/index.md b/docs/reference/test/index.md index 817457f..4d1e9fa 100644 --- a/docs/reference/test/index.md +++ b/docs/reference/test/index.md @@ -45,6 +45,7 @@ counterparts, the only difference being that they can be used inside a coroutine * [`QCORO_VERIFY2(condition, message)`][qdoc-qverify2] * [`QCORO_VERIFY(condition)`][qdoc-qverify] * [`QCORO_VERIFY_EXCEPTION_THROWN(expression, exceptionType)`][qdoc-qverify-exception-thrown] +* [`QCORO_VERIFY_THROWS_EXCEPTION(exceptionType, ...)`][qdoc6-qverify-throws-exception] [qdoc-qtest]: https://doc.qt.io/qt-5/qttest-index.html @@ -62,5 +63,6 @@ counterparts, the only difference being that they can be used inside a coroutine [qdoc-qverify2]: https://doc.qt.io/qt-5/qtest.html#QVERIFY2 [qdoc-qverify]: https://doc.qt.io/qt-5/qtest.html#QVERIFY [qdoc-qverify-exception-thrown]: https://doc.qt.io/qt-5/qtest.html#QVERIFY_EXCEPTION_THROWN +[qdoc6-qverify-throws-exception]: https://doc.qt.io/qt-6/qtest.html#QVERIFY_THROWS_EXCEPTION diff --git a/docs/release-checklist.md b/docs/release-checklist.md new file mode 100644 index 0000000..f03e0a9 --- /dev/null +++ b/docs/release-checklist.md @@ -0,0 +1,17 @@ +# QCoro Release Checklist + +1. Ensure all CI builds for current `main` pass +1. Create Release Announcement in `docs/news/` +1. Update `docs/changelog.md` +1. Bump version in `qcoro_VERSION` in CMakeLists.txt to `X.Y.Z` +1. Commit release announcement and version bump as `QCoro release X.Y.Z` +1. Tag the release commit: `git tag -s vX.Y.Z -m "QCoro X.Y.Z"` +1. Bump version in `qcoro_VERSION` in CMakeLists.txt to `X.Y.80` +1. Commit version bump as `Bump version to X.Y.80 (X.(Y+1).0 development)` +1. Push tag and commits: `git push --tags origin main` +1. [Create release in Github](https://github.com/danvratil/qcoro/releases/new) +1. Submit PR to update QCoro in [ConanCenter](https://github.com/conan-io/conan-center-index/) +1. Submit PRs to update QCoro in [vcpkg](https://github.com/microsoft/vcpkg) +1. Copy the release announcement to my blog to publicize the release on Planet KDE +1. Post an announcement to Twitter +1. Add any extra step taken during last release and not included in this list diff --git a/qcoro/CMakeLists.txt b/qcoro/CMakeLists.txt index 6c9fa07..01fe28d 100644 --- a/qcoro/CMakeLists.txt +++ b/qcoro/CMakeLists.txt @@ -24,6 +24,13 @@ add_qcoro_library( coroutine.h macros_p.h waitoperationbase_p.h + impl/connect.h + impl/task.h + impl/taskawaiterbase.h + impl/taskfinalsuspend.h + impl/taskpromise.h + impl/taskpromisebase.h + impl/waitfor.h QT_LINK_LIBRARIES INTERFACE Core ) diff --git a/qcoro/core/CMakeLists.txt b/qcoro/core/CMakeLists.txt index 25a70de..2661b12 100644 --- a/qcoro/core/CMakeLists.txt +++ b/qcoro/core/CMakeLists.txt @@ -19,6 +19,8 @@ add_qcoro_library( QCoroThread QCoroTimer QCoroFuture + HEADERS + impl/isqprivatesignal.h QT_LINK_LIBRARIES PUBLIC Core QCORO_LINK_LIBRARIES diff --git a/qcoro/core/impl/isqprivatesignal.h b/qcoro/core/impl/isqprivatesignal.h new file mode 100644 index 0000000..ed087d1 --- /dev/null +++ b/qcoro/core/impl/isqprivatesignal.h @@ -0,0 +1,84 @@ +// SPDX-FileCopyrightText: 2023 Daniel Vrátil +// +// SPDX-License-Identifier: MIT + +#pragma once + +#include +#include + +#if defined(__cpp_lib_source_location) +#include +#endif + +namespace QCoro::detail { +/** + * A whacky helper to detect whether T is a QPrivateSignal type. + * + * The problem with QPrivateSignal is that it's a struct that's private + * to each QObject-derived class, so we can't simply do std::same_as_v + * because we cannot access the private QPrivateSignal struct from here. + * + * The only solution I could come up with abuses std::source_location + * to get a string with name of the function which also shows what T is, + * and then check whether the string contains "::QPrivateSignal" substring + * in the right place. The whole check is compile-time, so there's no runtime + * overhead. + * + * Unfortunately the output format of std::source_location::function_name() is + * implementation-specific, so we need to handle each compiler separately. This + * can cause truble in the future if an implementation changes the output format. + **/ +template +struct is_qprivatesignal { +private: + static constexpr std::string_view qprivatesignal = "QPrivateSignal"; + + static constexpr auto functionName() noexcept { +#if defined(_MSC_VER) + // While MSVC does support std::source_location, std::source_location::function_name() + // returns only the name of the function ("functionName"), but we need the fully qualified + // name, which MSVC-specific __FUNCSIG__ macro gives us + return __FUNCSIG__; +#elif defined(__cpp_lib_source_location) + return std::source_location::current().function_name(); +#else + return __PRETTY_FUNCTION__; +#endif + } + + static constexpr bool getValue() { + // Clang: static auto QCoro::detail::is_qprivatesignal::functionName() [T = Foo] + // GCC : static consteval auto QCoro::detail::is_qprivatesignal::functionName() [with T = Foo] + // MSVC : const char *__cdecl QCoro::detail::is_qprivatesignal::functionName(void) + + // Note: can't use auto here as it gets deduced as const char* for some reason despite + // functionName() explicitly returning std::string_view. + constexpr std::string_view name{functionName()}; +#if defined(_MSC_VER) + constexpr auto end_pos = name.rfind('>'); +#else + constexpr auto end_pos = name.rfind(']'); +#endif + + if ((end_pos == std::string_view::npos) || (end_pos < qprivatesignal.size())) { + return false; + } + + for (auto pos = 1U; pos <= qprivatesignal.size(); ++pos) { + if (name[end_pos - pos] != qprivatesignal[qprivatesignal.size() - pos]) { + return false; + } + } + + return true; + } + +public: + static constexpr bool value = getValue(); +}; + +template +constexpr bool is_qprivatesignal_v = is_qprivatesignal>::value; + +} // namespace QCoro::detail diff --git a/qcoro/core/qcorosignal.h b/qcoro/core/qcorosignal.h index fcb5c81..3d3b927 100644 --- a/qcoro/core/qcorosignal.h +++ b/qcoro/core/qcorosignal.h @@ -1,4 +1,4 @@ -// SPDX-FileCopyrightText: 2021 Daniel Vrátil +// SPDX-FileCopyrightText: 2021-2023 Daniel Vrátil // // SPDX-License-Identifier: MIT @@ -17,6 +17,10 @@ #include #include #include +#include +#include + +#include "impl/isqprivatesignal.h" namespace QCoro::detail { @@ -31,34 +35,67 @@ concept QObject = requires(T *obj) { } // namespace concepts -template -struct args_tuple; +template +class QCoroSignalBase { +private: + template + struct concat_tuple; -template -struct args_tuple { - using type = std::tuple...>; -}; + template + struct concat_tuple> { + using type = std::tuple; + }; -template -struct args_tuple { - using type = std::tuple...>; -}; + template + struct filtered_tuple; -template -struct args_tuple { - using type = std::remove_cvref_t; -}; + template + struct filtered_tuple { + using type = std::conditional_t< + is_qprivatesignal_v, typename filtered_tuple::type, + typename filtered_tuple::type, Args...>::type>; + }; -template -struct args_tuple { - using type = std::remove_cvref_t; -}; + template + struct filtered_tuple { + using type = Tuple; + }; + + template + struct args_tuple; + + template + struct args_tuple { + using type = std::tuple...>; + }; + + template + struct args_tuple { + using type = typename filtered_tuple, std::remove_cvref_t...>::type; + }; + + template + struct result_type_from_tuple; + + template + struct result_type_from_tuple> { + using type = Arg; + }; + + template + struct result_type_from_tuple> { + using type = std::tuple; + }; + + using result_tuple = typename args_tuple>::type; -template -class QCoroSignalBase { public: - // TODO: Ignore QPrivateSignal - using result_type = std::optional>::type>; + /**! + * The result_type is std::optional of + * * T if result_tuple is std::tuple + * * result_tuple otherwise + **/ + using result_type = std::optional::type>; QCoroSignalBase(const QCoroSignalBase &) = delete; QCoroSignalBase &operator=(const QCoroSignalBase &) = delete; @@ -92,6 +129,33 @@ class QCoroSignalBase { } } + template + struct select_last { + using type = typename decltype((std::type_identity{}, ...))::type; + }; + + template + constexpr void storeResult(StoreResultCb &&storeResult, Args &&...args) { + using LastArg = typename select_last::type; + if constexpr (is_qprivatesignal_v) { + // Based on https://stackoverflow.com/a/77026174/4601437 + // Remove the last element (which is a QPrivateSignal) from the tuple + auto all = std::forward_as_tuple(std::forward(args)...); + auto reduced = [&](std::index_sequence) constexpr { + return std::make_tuple(std::get(all)...); + }(std::make_index_sequence{}); + // Use the shortened tuple as arguments to mResult.emplace() + std::apply(std::forward(storeResult), std::move(reduced)); + } else { + std::invoke(std::forward(storeResult), std::forward(args)...); + } + } + + template + constexpr void storeResult(StoreResultCb &&storeResult) { + std::invoke(std::forward(storeResult)); + } + protected: QPointer mObj; FuncPtr mFuncPtr; @@ -158,7 +222,10 @@ class QCoroSignal : public QCoroSignalBase { } QObject::disconnect(this->mConn); - mResult.emplace(std::forward(args)...); + this->storeResult([this](auto && ...args) { + mResult.emplace(std::forward(args)...); + }, std::forward(args)...); + if (mAwaitingCoroutine) { mAwaitingCoroutine.resume(); } @@ -246,7 +313,10 @@ class QCoroSignalQueue : public QCoroSignalBase { if (this->mTimeoutTimer) { this->mTimeoutTimer->stop(); } - mQueue.emplace_back(std::forward(args) ...); + + this->storeResult([this](auto && ...args) { + mQueue.emplace_back(std::forward(args)...); + }, std::forward(args) ...); if (mAwaitingCoroutine) { mAwaitingCoroutine.resume(); diff --git a/qcoro/core/qcorothread.cpp b/qcoro/core/qcorothread.cpp index f8622db..b1c73ee 100644 --- a/qcoro/core/qcorothread.cpp +++ b/qcoro/core/qcorothread.cpp @@ -6,6 +6,8 @@ #include "qcorosignal.h" #include +#include +#include using namespace QCoro; using namespace QCoro::detail; diff --git a/qcoro/coroutine.h b/qcoro/coroutine.h index 89d816c..61cf57e 100644 --- a/qcoro/coroutine.h +++ b/qcoro/coroutine.h @@ -92,10 +92,11 @@ struct coroutine_handle : public std::coroutine_handle {}; } // namespace experimental +#if defined(__cpp_lib_coroutine) // Import std::experimental::coroutine_traits into the std namespace template using coroutine_traits = std::experimental::coroutine_traits; - +#endif // 17.12.3, coroutine handle diff --git a/qcoro/impl/connect.h b/qcoro/impl/connect.h new file mode 100644 index 0000000..7b01416 --- /dev/null +++ b/qcoro/impl/connect.h @@ -0,0 +1,61 @@ +// SPDX-FileCopyrightText: 2023 Daniel Vrátil +// +// SPDX-License-Identifier: MIT + +/* + * Do NOT include this file directly - include the QCoroTask header instead! + */ + +#pragma once + +#include "../qcorotask.h" + +#include + +namespace QCoro +{ + +template +requires std::is_invocable_v || std::is_invocable_v || std::is_invocable_v || std::is_invocable_v +inline void connect(QCoro::Task &&task, QObjectSubclass *context, Callback func) { + QPointer ctxWatcher = context; + if constexpr (std::is_same_v) { + task.then([ctxWatcher, func = std::move(func)]() { + if (ctxWatcher) { + if constexpr (std::is_member_function_pointer_v) { + (ctxWatcher->*func)(); + } else { + func(); + } + } + }); + } else { + task.then([ctxWatcher, func = std::move(func)](auto &&value) { + if (ctxWatcher) { + if constexpr (std::is_invocable_v) { + (ctxWatcher->*func)(std::forward(value)); + } else if constexpr (std::is_invocable_v) { + func(std::forward(value)); + } else { + Q_UNUSED(value); + if constexpr (std::is_member_function_pointer_v) { + (ctxWatcher->*func)(); + } else { + func(); + } + } + } + }); + } +} + +template +requires detail::TaskConvertible + && (std::is_invocable_v || std::is_invocable_v> || std::is_invocable_v || std::is_invocable_v>) + && (!detail::isTask_v) +inline void connect(T &&future, QObjectSubclass *context, Callback func) { + auto task = detail::toTask(std::move(future)); + connect(std::move(task), context, func); +} + +} // namespace QCoro \ No newline at end of file diff --git a/qcoro/impl/task.h b/qcoro/impl/task.h new file mode 100644 index 0000000..8315632 --- /dev/null +++ b/qcoro/impl/task.h @@ -0,0 +1,150 @@ +// SPDX-FileCopyrightText: 2023 Daniel Vrátil +// +// SPDX-License-Identifier: MIT + +/* + * Do NOT include this file directly - include the QCoroTask header instead! + */ + +#pragma once + +#include "../qcorotask.h" + +#include + +namespace QCoro +{ + +template +inline Task::Task(std::coroutine_handle coroutine) : mCoroutine(coroutine) {} + +template +inline Task::Task(Task &&other) noexcept : mCoroutine(other.mCoroutine) { + other.mCoroutine = nullptr; +} + + //! The task can be move-assigned. +template +inline auto Task::operator=(Task &&other) noexcept -> Task & { + if (std::addressof(other) != this) { + if (mCoroutine) { + // The coroutine handle will be destroyed only after TaskFinalSuspend + if (mCoroutine.promise().setDestroyHandle()) { + mCoroutine.destroy(); + } + } + + mCoroutine = other.mCoroutine; + other.mCoroutine = nullptr; + } + return *this; +} + +template +inline Task::~Task() { + if (!mCoroutine) return; + + // The coroutine handle will be destroyed only after TaskFinalSuspend + if (mCoroutine.promise().setDestroyHandle()) { + mCoroutine.destroy(); + } +} + +template +inline bool Task::isReady() const { + return !mCoroutine || mCoroutine.done(); +} + +template +inline auto Task::operator co_await() const noexcept { + //! Specialization of the TaskAwaiterBase that returns the promise result by value + class TaskAwaiter : public detail::TaskAwaiterBase { + public: + TaskAwaiter(std::coroutine_handle awaitedCoroutine) + : detail::TaskAwaiterBase{awaitedCoroutine} {} + + //! Called when the co_awaited coroutine is resumed. + /* + * \return the result from the coroutine's promise, factically the + * value co_returned by the coroutine. */ + auto await_resume() { + Q_ASSERT(this->mAwaitedCoroutine != nullptr); + if constexpr (!std::is_void_v) { + return std::move(this->mAwaitedCoroutine.promise().result()); + } else { + // Wil re-throw exception, if any is stored + this->mAwaitedCoroutine.promise().result(); + } + } + }; + + return TaskAwaiter{mCoroutine}; +} + +template +template +requires (std::is_invocable_v || (!std::is_void_v && std::is_invocable_v)) +inline auto Task::then(ThenCallback &&callback) { + // Provide a custom error handler that simply re-throws the current exception + return thenImpl(std::forward(callback), [](const auto &) { throw; }); +} + +template +template +requires ((std::is_invocable_v || (!std::is_void_v && std::is_invocable_v)) && + std::is_invocable_v) +inline auto Task::then(ThenCallback &&callback, ErrorCallback &&errorCallback) { + return thenImpl(std::forward(callback), std::forward(errorCallback)); +} + +template +template +inline auto Task::invokeCb(ThenCallback &&callback, [[maybe_unused]] Args && ... args) { + if constexpr (std::is_invocable_v) { + return callback(std::forward(args) ...); + } else { + return callback(); + } +} + +template +template +inline auto Task::handleException(ErrorCallback &errCb, const std::exception &exception) -> U { + errCb(exception); + if constexpr (!std::is_void_v) { + return U{}; + } +} + +template +template +inline auto Task::thenImpl(ThenCallback &&thenCallback, ErrorCallback &&errorCallback) -> std::conditional_t, R, Task> { + auto thenCb = std::forward(thenCallback); + auto errCb = std::forward(errorCallback); + if constexpr (std::is_void_v) { + try { + co_await *this; + } catch (const std::exception &e) { + co_return handleException(errCb, e); + } + if constexpr (detail::isTask_v) { + co_return co_await invokeCb(thenCb); + } else { + co_return invokeCb(thenCb); + } + } else { + std::optional value; + try { + value = co_await *this; + } catch (const std::exception &e) { + co_return handleException(errCb, e); + } + if constexpr (detail::isTask_v) { + co_return co_await invokeCb(thenCb, std::move(*value)); + } else { + co_return invokeCb(thenCb, std::move(*value)); + } + } +} + +} // namespace QCoro \ No newline at end of file diff --git a/qcoro/impl/taskawaiterbase.h b/qcoro/impl/taskawaiterbase.h new file mode 100644 index 0000000..14a23c9 --- /dev/null +++ b/qcoro/impl/taskawaiterbase.h @@ -0,0 +1,30 @@ +// SPDX-FileCopyrightText: 2023 Daniel Vrátil +// +// SPDX-License-Identifier: MIT + +/* + * Do NOT include this file directly - include the QCoroTask header instead! + */ + +#pragma once + +#include "../qcorotask.h" + +namespace QCoro::detail +{ + +template +inline bool TaskAwaiterBase::await_ready() const noexcept { + return !mAwaitedCoroutine || mAwaitedCoroutine.done(); +} + +template +inline void TaskAwaiterBase::await_suspend(std::coroutine_handle<> awaitingCoroutine) noexcept { + mAwaitedCoroutine.promise().addAwaitingCoroutine(awaitingCoroutine); +} + +template +inline TaskAwaiterBase::TaskAwaiterBase(std::coroutine_handle awaitedCoroutine) + : mAwaitedCoroutine(awaitedCoroutine) {} + +} // namespace QCoro::detail \ No newline at end of file diff --git a/qcoro/impl/taskfinalsuspend.h b/qcoro/impl/taskfinalsuspend.h new file mode 100644 index 0000000..f1110ef --- /dev/null +++ b/qcoro/impl/taskfinalsuspend.h @@ -0,0 +1,40 @@ +// SPDX-FileCopyrightText: 2023 Daniel Vrátil +// +// SPDX-License-Identifier: MIT + +/* + * Do NOT include this file directly - include the QCoroTask header instead! + */ + +#pragma once + +#include "../qcorotask.h" + +namespace QCoro::detail +{ + +inline TaskFinalSuspend::TaskFinalSuspend(const std::vector> &awaitingCoroutines) + : mAwaitingCoroutines(awaitingCoroutines) {} + +inline bool TaskFinalSuspend::await_ready() const noexcept { + return false; +} + +template +inline void TaskFinalSuspend::await_suspend(std::coroutine_handle finishedCoroutine) noexcept { + auto &promise = finishedCoroutine.promise(); + + for (auto &awaiter : mAwaitingCoroutines) { + awaiter.resume(); + } + mAwaitingCoroutines.clear(); + + // The handle will be destroyed here only if the associated Task has already been destroyed + if (promise.setDestroyHandle()) { + finishedCoroutine.destroy(); + } +} + +constexpr void TaskFinalSuspend::await_resume() const noexcept {} + +} // namespace QCoro::detail \ No newline at end of file diff --git a/qcoro/impl/taskpromise.h b/qcoro/impl/taskpromise.h new file mode 100644 index 0000000..2baf671 --- /dev/null +++ b/qcoro/impl/taskpromise.h @@ -0,0 +1,86 @@ +// SPDX-FileCopyrightText: 2023 Daniel Vrátil +// +// SPDX-License-Identifier: MIT + +/* + * Do NOT include this file directly - include the QCoroTask header instead! + */ + +#pragma once + +#include "../qcorotask.h" + +#include // for Q_ASSERT + +namespace QCoro::detail +{ + +template +inline Task TaskPromise::get_return_object() noexcept { + return Task{std::coroutine_handle::from_promise(*this)}; +} + +template +inline void TaskPromise::unhandled_exception() { + mValue = std::current_exception(); +} + +template +inline void TaskPromise::return_value(T &&value) noexcept { + mValue.template emplace(std::forward(value)); +} + +template +inline void TaskPromise::return_value(const T &value) noexcept { + mValue = value; +} + +template +template requires QCoro::concepts::constructible_from +inline void TaskPromise::return_value(U &&value) noexcept { + mValue = std::move(value); +} + +template +template requires QCoro::concepts::constructible_from +inline void TaskPromise::return_value(const U &value) noexcept { + mValue = value; +} + +template +inline T &TaskPromise::result() & { + if (std::holds_alternative(mValue)) { + Q_ASSERT(std::get(mValue) != nullptr); + std::rethrow_exception(std::get(mValue)); + } + + return std::get(mValue); +} + +template +inline T &&TaskPromise::result() && { + if (std::holds_alternative(mValue)) { + Q_ASSERT(std::get(mValue) != nullptr); + std::rethrow_exception(std::get(mValue)); + } + + return std::move(std::get(mValue)); +} + +inline Task TaskPromise::get_return_object() noexcept { + return Task{std::coroutine_handle::from_promise(*this)}; +} + +inline void TaskPromise::unhandled_exception() { + mException = std::current_exception(); +} + +inline void TaskPromise::return_void() noexcept {} + +inline void TaskPromise::result() { + if (mException) { + std::rethrow_exception(mException); + } +} + +} // namespace QCoro::detail \ No newline at end of file diff --git a/qcoro/impl/taskpromisebase.h b/qcoro/impl/taskpromisebase.h new file mode 100644 index 0000000..2011e76 --- /dev/null +++ b/qcoro/impl/taskpromisebase.h @@ -0,0 +1,61 @@ +// SPDX-FileCopyrightText: 2023 Daniel Vrátil +// +// SPDX-License-Identifier: MIT + +/* + * Do NOT include this file directly - include the QCoroTask header instead! + */ + +#pragma once + +#include "../qcorotask.h" + +namespace QCoro::detail +{ + +inline std::suspend_never TaskPromiseBase::initial_suspend() const noexcept { + return {}; +} + +inline auto TaskPromiseBase::final_suspend() const noexcept { + return TaskFinalSuspend{mAwaitingCoroutines}; +} + +template +inline auto TaskPromiseBase::await_transform(T &&value) { + return Awaiter{std::forward(value)}; +} + +template +inline auto TaskPromiseBase::await_transform(QCoro::Task &&task) { + return std::forward>(task); +} + +template +inline auto &TaskPromiseBase::await_transform(QCoro::Task &task) { + return task; +} + +template +inline auto && TaskPromiseBase::await_transform(T &&awaitable) { + return std::forward(awaitable); +} + +template +inline auto &TaskPromiseBase::await_transform(T &awaitable) { + return awaitable; +} + +inline void TaskPromiseBase::addAwaitingCoroutine(std::coroutine_handle<> awaitingCoroutine) { + mAwaitingCoroutines.push_back(awaitingCoroutine); +} + +inline bool TaskPromiseBase::hasAwaitingCoroutine() const { + return !mAwaitingCoroutines.empty(); +} + +inline bool TaskPromiseBase::setDestroyHandle() noexcept { + return mDestroyHandle.exchange(true, std::memory_order_acq_rel); +} + +} // namespace QCoro::detail \ No newline at end of file diff --git a/qcoro/impl/waitfor.h b/qcoro/impl/waitfor.h new file mode 100644 index 0000000..0ad7ec0 --- /dev/null +++ b/qcoro/impl/waitfor.h @@ -0,0 +1,105 @@ +// SPDX-FileCopyrightText: 2023 Daniel Vrátil +// +// SPDX-License-Identifier: MIT + +/* + * Do NOT include this file directly - include the QCoroTask header instead! + */ + +#pragma once + +#include "../qcorotask.h" + +#include + +namespace QCoro +{ + +namespace detail +{ + +template +requires TaskConvertible +auto toTask(Awaitable &&future) -> QCoro::Task> { + co_return co_await future; +} + +struct WaitContext { + QEventLoop loop; + bool coroutineFinished = false; + std::exception_ptr exception; +}; + +//! Helper class to run a coroutine in a nested event loop. +/*! + * We cannot just use QTimer or QMetaObject::invokeMethod() to schedule the func lambda to be + * invoked from an event loop, because internally, Qt deallocates some structures when the + * lambda returns, which causes invalid memory access and potentially double-free corruption + * because the coroutine returns twice - once on suspend and once when it really finishes. + * So instead we do basically what Qt does internally, but we make sure to not delete th + * QFunctorSlotObjectWithNoArgs until after the event loop quits. + */ +template +Task<> runCoroutine(WaitContext &context, Awaitable &&awaitable) { + try { + co_await awaitable; + } catch (...) { + context.exception = std::current_exception(); + } + context.coroutineFinished = true; + context.loop.quit(); +} + +template +Task<> runCoroutine(WaitContext &context, T &result, Awaitable &&awaitable) { + try { + result = co_await awaitable; + } catch (...) { + context.exception = std::current_exception(); + } + context.coroutineFinished = true; + context.loop.quit(); +} + +template +T waitFor(Awaitable &&awaitable) { + WaitContext context; + if constexpr (std::is_void_v) { + runCoroutine(context, std::forward(awaitable)); + if (!context.coroutineFinished) { + context.loop.exec(); + } + if (context.exception) { + std::rethrow_exception(context.exception); + } + } else { + T result; + runCoroutine(context, result, std::forward(awaitable)); + if (!context.coroutineFinished) { + context.loop.exec(); + } + if (context.exception) { + std::rethrow_exception(context.exception); + } + return result; + } +} + +} // namespace detail + +template +inline T waitFor(QCoro::Task &task) { + return detail::waitFor(std::forward>(task)); +} + +template +inline T waitFor(QCoro::Task &&task) { + return detail::waitFor(std::forward>(task)); +} + +template +inline auto waitFor(Awaitable &&awaitable) { + return detail::waitFor>(std::forward(awaitable)); +} + +} // namespace QCoro \ No newline at end of file diff --git a/qcoro/qcoroasyncgenerator.h b/qcoro/qcoroasyncgenerator.h index bc62737..b976dbd 100644 --- a/qcoro/qcoroasyncgenerator.h +++ b/qcoro/qcoroasyncgenerator.h @@ -281,8 +281,7 @@ class [[nodiscard]] AsyncGenerator { using iterator = AsyncGeneratorIterator; /// Constructs an empty asynchronous generator - AsyncGenerator() noexcept - : m_coroutine(nullptr) {} + AsyncGenerator() noexcept = default; /// Constructs AsyncGenerator for given promise. explicit AsyncGenerator(promise_type &promise) noexcept @@ -304,8 +303,8 @@ class [[nodiscard]] AsyncGenerator { /// Move-assignment operator. AsyncGenerator& operator=(AsyncGenerator &&other) noexcept { - AsyncGenerator temp(std::move(other)); - swap(temp); + m_coroutine = other.m_coroutine; + other.m_coroutine = nullptr; return *this; } @@ -364,7 +363,7 @@ class [[nodiscard]] AsyncGenerator { } private: - std::coroutine_handle m_coroutine; + std::coroutine_handle m_coroutine = {nullptr}; }; template diff --git a/qcoro/qcorotask.h b/qcoro/qcorotask.h index 5a59e37..5428bd5 100644 --- a/qcoro/qcorotask.h +++ b/qcoro/qcorotask.h @@ -11,13 +11,7 @@ #include #include #include -#include - -#include -#include -#include -#include -#include +#include namespace QCoro { @@ -42,8 +36,7 @@ class TaskFinalSuspend { * \param[in] awaitingCoroutine handle of the coroutine that is co_awaiting the current * coroutine (continuation). */ - explicit TaskFinalSuspend(const std::vector> &awaitingCoroutines) - : mAwaitingCoroutines(awaitingCoroutines) {} + explicit TaskFinalSuspend(const std::vector> &awaitingCoroutines); //! Returns whether the just finishing coroutine should do final suspend or not /*! @@ -52,9 +45,7 @@ class TaskFinalSuspend { * care of cleaning everything up. Otherwise we suspend and let the awaiting * coroutine to clean up for us. */ - bool await_ready() const noexcept { - return false; - } + bool await_ready() const noexcept; //! Called by the compiler when the just-finished coroutine is suspended. for the very last time. /*! @@ -67,26 +58,14 @@ class TaskFinalSuspend { * \param[in] finishedCoroutine handle of the just finished coroutine */ template - void await_suspend(std::coroutine_handle finishedCoroutine) noexcept { - auto &promise = finishedCoroutine.promise(); - - for (auto &awaiter : mAwaitingCoroutines) { - awaiter.resume(); - } - mAwaitingCoroutines.clear(); - - // The handle will be destroyed here only if the associated Task has already been destroyed - if (promise.setDestroyHandle()) { - finishedCoroutine.destroy(); - } - } + void await_suspend(std::coroutine_handle finishedCoroutine) noexcept; //! Called by the compiler when the just-finished coroutine should be resumed. /*! * In reality this should never be called, as our coroutine is done, so it won't be resumed. * In any case, this method does nothing. * */ - constexpr void await_resume() const noexcept {} + constexpr void await_resume() const noexcept; private: std::vector> mAwaitingCoroutines; @@ -140,17 +119,13 @@ class TaskPromiseBase { * it as a regular function, therefore it returns `std::suspend_never` awaitable, which * indicates that the coroutine should not be suspended. * */ - std::suspend_never initial_suspend() const noexcept { - return {}; - } + std::suspend_never initial_suspend() const noexcept; //! Called when the coroutine co_returns or reaches the end of user code. /*! * This decides what should happen when the coroutine is finished. */ - auto final_suspend() const noexcept { - return TaskFinalSuspend{mAwaitingCoroutines}; - } + auto final_suspend() const noexcept; //! Called by co_await to obtain an Awaitable for type \c T. /*! @@ -168,9 +143,7 @@ class TaskPromiseBase { * specialization returns type of the Awaiter for the given type \c T. */ template>> - auto await_transform(T &&value) { - return Awaiter{value}; - } + auto await_transform(T &&value); //! Specialized overload of await_transform() for Task. /*! @@ -194,27 +167,19 @@ class TaskPromiseBase { * as an Awaitable type. */ template - auto await_transform(QCoro::Task &&task) { - return std::forward>(task); - } + auto await_transform(QCoro::Task &&task); //! \copydoc template QCoro::TaskPromiseBase::await_transform(QCoro::Task &&) template - auto &await_transform(QCoro::Task &task) { - return task; - } + auto &await_transform(QCoro::Task &task); //! If the type T is already an awaitable, then just forward it as it is. template - auto && await_transform(T &&awaitable) { - return std::forward(awaitable); - } + auto && await_transform(T &&awaitable); //! \copydoc template QCoro::TaskPromiseBase::await_transform(T &&) template - auto &await_transform(T &awaitable) { - return awaitable; - } + auto &await_transform(T &awaitable); //! Called by \c TaskAwaiter when co_awaited. /*! @@ -226,17 +191,11 @@ class TaskPromiseBase { * represented by this promise. When our coroutine finishes, it's * our job to resume the awaiting coroutine. */ - void addAwaitingCoroutine(std::coroutine_handle<> awaitingCoroutine) { - mAwaitingCoroutines.push_back(awaitingCoroutine); - } + void addAwaitingCoroutine(std::coroutine_handle<> awaitingCoroutine); - bool hasAwaitingCoroutine() const { - return !mAwaitingCoroutines.empty(); - } + bool hasAwaitingCoroutine() const; - bool setDestroyHandle() noexcept { - return mDestroyHandle.exchange(true, std::memory_order_acq_rel); - } + bool setDestroyHandle() noexcept; private: friend class TaskFinalSuspend; @@ -268,57 +227,32 @@ class TaskPromise final : public TaskPromiseBase { * is called. This method stores the exception. The exception is re-thrown when the calling * coroutine is resumed and tries to retrieve result of the finished coroutine that has thrown. */ - void unhandled_exception() { - mValue = std::current_exception(); - } + void unhandled_exception(); //! Called form co_return statement to store result of the coroutine. /*! * \param[in] value the value returned by the coroutine. It is stored in the * promise, later can be retrieved by the calling coroutine. */ - void return_value(T &&value) noexcept { - mValue.template emplace(std::forward(value)); - } + void return_value(T &&value) noexcept; //! \copydoc template TaskPromise::return_value(T &&value) noexcept - void return_value(const T &value) noexcept { - mValue = value; - } + void return_value(const T &value) noexcept; template requires QCoro::concepts::constructible_from - void return_value(U &&value) noexcept { - mValue = std::move(value); - } + void return_value(U &&value) noexcept; template requires QCoro::concepts::constructible_from - void return_value(const U &value) noexcept { - mValue = value; - } + void return_value(const U &value) noexcept; //! Retrieves the result of the coroutine. /*! * \return the value co_returned by the finished coroutine. If the coroutine has * thrown an exception, this method will instead rethrow the exception. */ - T &result() & { - if (std::holds_alternative(mValue)) { - Q_ASSERT(std::get(mValue) != nullptr); - std::rethrow_exception(std::get(mValue)); - } - - return std::get(mValue); - } - + T &result() &; //! \copydoc T &QCoro::TaskPromise::result() & - T &&result() && { - if (std::holds_alternative(mValue)) { - Q_ASSERT(std::get(mValue) != nullptr); - std::rethrow_exception(std::get(mValue)); - } - - return std::move(std::get(mValue)); - } + T &&result() &&; private: //! Holds either the return value of the coroutine or exception thrown by the coroutine. @@ -339,12 +273,10 @@ class TaskPromise final : public TaskPromiseBase { Task get_return_object() noexcept; //! \copydoc TaskPromise::unhandled_exception() - void unhandled_exception() { - mException = std::current_exception(); - } + void unhandled_exception(); //! Promise type must have this function when the coroutine return type is void. - void return_void() noexcept {}; + void return_void() noexcept; //! Provides access to the result of the coroutine. /*! @@ -352,11 +284,7 @@ class TaskPromise final : public TaskPromiseBase { * this can return is re-throwing an exception thrown by the coroutine, if * there's any. */ - void result() { - if (mException) { - std::rethrow_exception(mException); - } - } + void result(); private: //! Exception thrown by the coroutine. @@ -368,9 +296,7 @@ template class TaskAwaiterBase { public: //! Returns whether to co_await - bool await_ready() const noexcept { - return !mAwaitedCoroutine || mAwaitedCoroutine.done(); - } + bool await_ready() const noexcept; //! Called by co_await in a coroutine that co_awaits our awaited coroutine managed by the current task. /*! @@ -404,17 +330,14 @@ class TaskAwaiterBase { * co_awaited coroutine has finished synchronously and the co_awaiting coroutine doesn't * have to suspend. */ - void await_suspend(std::coroutine_handle<> awaitingCoroutine) noexcept { - mAwaitedCoroutine.promise().addAwaitingCoroutine(awaitingCoroutine); - } + void await_suspend(std::coroutine_handle<> awaitingCoroutine) noexcept; protected: //! Constucts a new Awaiter object. /*! * \param[in] coroutine hande for the coroutine that is being co_awaited. */ - TaskAwaiterBase(std::coroutine_handle awaitedCoroutine) - : mAwaitedCoroutine(awaitedCoroutine) {} + explicit TaskAwaiterBase(std::coroutine_handle awaitedCoroutine); //! Handle of the coroutine that is being co_awaited by this awaiter std::coroutine_handle mAwaitedCoroutine = {}; @@ -470,7 +393,7 @@ class Task { /*! * \param[in] coroutine handle of the coroutine that has constructed the task. */ - explicit Task(std::coroutine_handle coroutine) : mCoroutine(coroutine) {} + explicit Task(std::coroutine_handle coroutine); //! Task cannot be copy-constructed. Task(const Task &) = delete; @@ -478,44 +401,20 @@ class Task { Task &operator=(const Task &) = delete; //! The task can be move-constructed. - Task(Task &&other) noexcept : mCoroutine(other.mCoroutine) { - other.mCoroutine = nullptr; - } + Task(Task &&other) noexcept; //! The task can be move-assigned. - Task &operator=(Task &&other) noexcept { - if (std::addressof(other) != this) { - if (mCoroutine) { - // The coroutine handle will be destroyed only after TaskFinalSuspend - if (mCoroutine.promise().setDestroyHandle()) { - mCoroutine.destroy(); - } - } - - mCoroutine = other.mCoroutine; - other.mCoroutine = nullptr; - } - return *this; - } + Task &operator=(Task &&other) noexcept; //! Destructor. - ~Task() { - if (!mCoroutine) return; - - // The coroutine handle will be destroyed only after TaskFinalSuspend - if (mCoroutine.promise().setDestroyHandle()) { - mCoroutine.destroy(); - } - }; + ~Task(); //! Returns whether the task has finished. /*! * A task that is ready (represents a finished coroutine) must not attempt * to suspend the coroutine again. */ - bool isReady() const { - return !mCoroutine || mCoroutine.done(); - } + bool isReady() const; //! Provides an Awaiter for the coroutine machinery. /*! @@ -524,30 +423,7 @@ class Task { * object, that is an object that the co_await keyword uses to suspend and * resume the coroutine. */ - auto operator co_await() const noexcept { - //! Specialization of the TaskAwaiterBase that returns the promise result by value - class TaskAwaiter : public detail::TaskAwaiterBase { - public: - TaskAwaiter(std::coroutine_handle awaitedCoroutine) - : detail::TaskAwaiterBase{awaitedCoroutine} {} - - //! Called when the co_awaited coroutine is resumed. - /* - * \return the result from the coroutine's promise, factically the - * value co_returned by the coroutine. */ - auto await_resume() { - Q_ASSERT(this->mAwaitedCoroutine != nullptr); - if constexpr (!std::is_void_v) { - return std::move(this->mAwaitedCoroutine.promise().result()); - } else { - // Wil re-throw exception, if any is stored - this->mAwaitedCoroutine.promise().result(); - } - } - }; - - return TaskAwaiter{mCoroutine}; - } + auto operator co_await() const noexcept; //! A callback to be invoked when the asynchronous task finishes. /*! @@ -567,27 +443,16 @@ class Task { */ template requires (std::is_invocable_v || (!std::is_void_v && std::is_invocable_v)) - auto then(ThenCallback &&callback) { - // Provide a custom error handler that simply re-throws the current exception - return thenImpl(std::forward(callback), [](const auto &) { throw; }); - } + auto then(ThenCallback &&callback); template requires ((std::is_invocable_v || (!std::is_void_v && std::is_invocable_v)) && std::is_invocable_v) - auto then(ThenCallback &&callback, ErrorCallback &&errorCallback) { - return thenImpl(std::forward(callback), std::forward(errorCallback)); - } + auto then(ThenCallback &&callback, ErrorCallback &&errorCallback); private: template - auto invokeCb(ThenCallback &&callback, [[maybe_unused]] Args && ... args) { - if constexpr (std::is_invocable_v) { - return callback(std::forward(args) ...); - } else { - return callback(); - } - } + auto invokeCb(ThenCallback &&callback, [[maybe_unused]] Args && ... args); template struct cb_invoke_result: std::conditional_t< @@ -604,42 +469,10 @@ class Task { template::return_type> - auto handleException(ErrorCallback &errCb, const std::exception &exception) -> U { - errCb(exception); - if constexpr (!std::is_void_v) { - return U{}; - } - } + auto handleException(ErrorCallback &errCb, const std::exception &exception) -> U; template> - auto thenImpl(ThenCallback &&thenCallback, ErrorCallback &&errorCallback) -> std::conditional_t, R, Task> { - auto thenCb = std::forward(thenCallback); - auto errCb = std::forward(errorCallback); - if constexpr (std::is_void_v) { - try { - co_await *this; - } catch (const std::exception &e) { - co_return handleException(errCb, e); - } - if constexpr (detail::isTask_v) { - co_return co_await invokeCb(thenCb); - } else { - co_return invokeCb(thenCb); - } - } else { - std::optional value; - try { - value = co_await *this; - } catch (const std::exception &e) { - co_return handleException(errCb, e); - } - if constexpr (detail::isTask_v) { - co_return co_await invokeCb(thenCb, std::move(*value)); - } else { - co_return invokeCb(thenCb, std::move(*value)); - } - } - } + auto thenImpl(ThenCallback &&thenCallback, ErrorCallback &&errorCallback) -> std::conditional_t, R, Task>; private: //! The coroutine represented by this task @@ -650,23 +483,13 @@ class Task { std::coroutine_handle mCoroutine = {}; }; -namespace detail { - -template -inline Task TaskPromise::get_return_object() noexcept { - return Task{std::coroutine_handle::from_promise(*this)}; -} - -Task inline TaskPromise::get_return_object() noexcept { - return Task{std::coroutine_handle::from_promise(*this)}; -} - - +namespace detail +{ template -concept TaskConvertible = requires(T v, TaskPromiseBase t) +concept TaskConvertible = requires(T val, TaskPromiseBase promise) { - { t.await_transform(v) }; + { promise.await_transform(val) }; }; template @@ -691,55 +514,6 @@ template requires TaskConvertible using convertible_awaitable_return_type_t = typename detail::awaitable_return_type().await_transform(Awaitable()))>::type; -template -requires TaskConvertible -auto toTask(Awaitable &&future) -> QCoro::Task> { - co_return co_await future; -} - - -//! Helper class to run a coroutine in a nested event loop. -/*! - * We cannot just use QTimer or QMetaObject::invokeMethod() to schedule the func lambda to be - * invoked from an event loop, because internally, Qt deallocates some structures when the - * lambda returns, which causes invalid memory access and potentially double-free corruption - * because the coroutine returns twice - once on suspend and once when it really finishes. - * So instead we do basically what Qt does internally, but we make sure to not delete th - * QFunctorSlotObjectWithNoArgs until after the event loop quits. - */ -template -Task<> runCoroutine(QEventLoop &loop, bool &startLoop, Awaitable &&awaitable) { - co_await awaitable; - startLoop = false; - loop.quit(); -} - -template -Task<> runCoroutine(QEventLoop &loop, bool &startLoop, T &result, Awaitable &&awaitable) { - result = co_await awaitable; - startLoop = false; - loop.quit(); -} - -template -T waitFor(Awaitable &&awaitable) { - QEventLoop loop; - bool startLoop = true; // for early returns: calling quit() before exec() still starts the loop - if constexpr (std::is_void_v) { - runCoroutine(loop, startLoop, std::forward(awaitable)); - if (startLoop) { - loop.exec(); - } - } else { - T result; - runCoroutine(loop, startLoop, result, std::forward(awaitable)); - if (startLoop) { - loop.exec(); - } - return result; - } -} - } // namespace detail //! Waits for a coroutine to complete in a blocking manner. @@ -752,20 +526,15 @@ T waitFor(Awaitable &&awaitable) { * \returns Result of the coroutine. */ template -inline T waitFor(QCoro::Task &task) { - return detail::waitFor(std::forward>(task)); -} +inline T waitFor(QCoro::Task &task); // \overload template -inline T waitFor(QCoro::Task &&task) { - return detail::waitFor(std::forward>(task)); -} +inline T waitFor(QCoro::Task &&task); +// \overload template -inline auto waitFor(Awaitable &&awaitable) { - return detail::waitFor>(std::forward(awaitable)); -} +inline auto waitFor(Awaitable &&awaitable); //! Connect a callback to be called when the asynchronous task finishes. /*! @@ -781,45 +550,20 @@ inline auto waitFor(Awaitable &&awaitable) { */ template requires std::is_invocable_v || std::is_invocable_v || std::is_invocable_v || std::is_invocable_v -void connect(QCoro::Task &&task, QObjectSubclass *context, Callback func) { - QPointer ctxWatcher = context; - if constexpr (std::is_same_v) { - task.then([ctxWatcher, func = std::move(func)]() { - if (ctxWatcher) { - if constexpr (std::is_member_function_pointer_v) { - (ctxWatcher->*func)(); - } else { - func(); - } - } - }); - } else { - task.then([ctxWatcher, func = std::move(func)](auto &&value) { - if (ctxWatcher) { - if constexpr (std::is_invocable_v) { - (ctxWatcher->*func)(std::forward(value)); - } else if constexpr (std::is_invocable_v) { - func(std::forward(value)); - } else { - Q_UNUSED(value); - if constexpr (std::is_member_function_pointer_v) { - (ctxWatcher->*func)(); - } else { - func(); - } - } - } - }); - } -} +void connect(QCoro::Task &&task, QObjectSubclass *context, Callback func); template requires detail::TaskConvertible - && (std::is_invocable_v || std::is_invocable_v> || std::is_invocable_v || std::is_invocable_v) + && (std::is_invocable_v || std::is_invocable_v> || std::is_invocable_v || std::is_invocable_v>) && (!detail::isTask_v) -void connect(T &&future, QObjectSubclass *context, Callback func) { - auto task = detail::toTask(std::move(future)); - connect(std::move(task), context, func); -} +void connect(T &&future, QObjectSubclass *context, Callback func); } // namespace QCoro + +#include "impl/taskfinalsuspend.h" +#include "impl/taskpromisebase.h" +#include "impl/taskpromise.h" +#include "impl/taskawaiterbase.h" +#include "impl/task.h" +#include "impl/waitfor.h" +#include "impl/connect.h" diff --git a/qcoro/test/qcorotest.h b/qcoro/test/qcorotest.h index d40d335..3acedc8 100644 --- a/qcoro/test/qcorotest.h +++ b/qcoro/test/qcorotest.h @@ -58,13 +58,13 @@ #if !defined(QT_NO_EXCEPTIONS) /** - * @brief Coroutine-friendly version of QVERIFY_EXCEPTION_THROWN macro. + * @brief Coroutine-friendly version of QVERIFY_THROWS_EXCEPTION macro. **/ -#define QCORO_VERIFY_EXCEPTION_THROWN(expression, exceptionType) \ +#define QCORO_VERIFY_THROWS_EXCEPTION(exceptionType, ...) \ do { \ try { \ try { \ - expression; \ + __VA_ARGS__; \ QTest::qFail("Expected exception of type " #exceptionType " to be thrown" \ " but no exception caught", \ __FILE__, __LINE__); \ @@ -85,10 +85,18 @@ } \ } while (false) +/** + * @brief Coroutine-friendly version of QVERIFY_EXCEPTION_THROWN macro. + **/ +#define QCORO_VERIFY_EXCEPTION_THROWN(expression, exceptionType) \ + QCORO_VERIFY_THROWS_EXCEPTION(exceptionType, expression) + #else // QT_NO_EXCEPTIONS #define QCORO_VERIFY_EXCEPTION_THROWN(expression, exceptionType) \ static_assert(false, "Support of exceptions is disabled") +#define QCORO_VERIFY_THROWS_EXCEPTION(exceptionType, ...) \ + static_assert(false, "Support for exceptions is disabled") #endif // QT_NO_EXCEPTIONS diff --git a/qcoro/websockets/qcorowebsocket.cpp b/qcoro/websockets/qcorowebsocket.cpp index be9c1f7..c686d14 100644 --- a/qcoro/websockets/qcorowebsocket.cpp +++ b/qcoro/websockets/qcorowebsocket.cpp @@ -32,7 +32,13 @@ class WebSocketStateWatcher : public QObject { emitReady(true); } })) - , mError(connect(socket, qOverload(&QWebSocket::error), this, [this](auto error) { + , mError(connect(socket, qOverload( +#if QT_VERSION >= QT_VERSION_CHECK(6, 5, 0) + &QWebSocket::errorOccurred +#else + &QWebSocket::error +#endif + ), this, [this](auto error) { qWarning() << "QWebSocket failed to connect to a websocket server: " << error; emitReady(false); })) diff --git a/requirements.txt b/requirements.txt index 64cef27..096a067 100644 --- a/requirements.txt +++ b/requirements.txt @@ -1,7 +1,7 @@ setuptools wheel -pymdown-extensions~=9.11 -pygments~=2.15 +pymdown-extensions~=10.5 +pygments~=2.17 mkdocs mkdocs-material mkdocs-section-index diff --git a/tests/qcoroasyncgenerator.cpp b/tests/qcoroasyncgenerator.cpp index 5ef447e..551cfb8 100644 --- a/tests/qcoroasyncgenerator.cpp +++ b/tests/qcoroasyncgenerator.cpp @@ -6,6 +6,7 @@ #include "qcorotimer.h" #include "testobject.h" +#include #include #include @@ -169,22 +170,25 @@ class AsyncGeneratorTest : public QCoro::TestObject { } QCoro::Task<> testMovedGenerator_coro(QCoro::TestContext) { + QCoro::AsyncGenerator generator; + const auto createGenerator = []() -> QCoro::AsyncGenerator { for (int i = 0; i < 4; ++i) { co_await sleep(10ms); co_yield i; } }; - - auto originalGenerator = createGenerator(); - auto generator = std::move(originalGenerator); + + { + QCoro::AsyncGenerator originalGenerator = createGenerator(); + generator = std::move(originalGenerator); + } int testvalue = 0; for (auto it = co_await generator.begin(), end = generator.end(); it != end; co_await ++it) { int value = *it; QCORO_COMPARE(value, testvalue++); } QCORO_COMPARE(testvalue, 4); - } QCoro::Task<> testException_coro(QCoro::TestContext) { @@ -233,23 +237,33 @@ class AsyncGeneratorTest : public QCoro::TestObject { } QCoro::Task<> testExceptionInBegin_coro(QCoro::TestContext) { - auto generator = []() -> QCoro::AsyncGenerator { + bool throw_exception = true; + const auto createGenerator = [throw_exception]() -> QCoro::AsyncGenerator { co_await sleep(10ms); - throw std::runtime_error("I can't even zero!"); - co_yield 1; - }(); + // NOTE: The condition here is a necessary workaround for Clang being too clever, + // seeing that `co_yield` will never be reached and optimizing it away, thus breaking + // the coroutine. With this condition (or by wrapping the body into a for-loop) the + // optimization is disabled (as the co_yield could *theoretically* be reached) and + // the generator behaves as expected. + if (throw_exception) { + throw std::runtime_error("I can't even zero!"); + } + co_yield 42; + }; + auto generator = createGenerator(); QCORO_VERIFY_EXCEPTION_THROWN(co_await generator.begin(), std::runtime_error); } QCoro::Task<> testExceptionInBeginSync_coro(QCoro::TestContext context) { context.setShouldNotSuspend(); - auto generator = []() -> QCoro::AsyncGenerator { + const auto createGenerator = []() -> QCoro::AsyncGenerator { throw std::runtime_error("I can't even zero!"); co_yield 1; - }(); + }; + auto generator = createGenerator(); QCORO_VERIFY_EXCEPTION_THROWN(co_await generator.begin(), std::runtime_error); } diff --git a/tests/qcorosignal.cpp b/tests/qcorosignal.cpp index 1bc22c7..6d56f2a 100644 --- a/tests/qcorosignal.cpp +++ b/tests/qcorosignal.cpp @@ -24,12 +24,18 @@ class SignalTest : public QObject { Q_EMIT voidSignal(); Q_EMIT singleArg(QStringLiteral("YAY!")); Q_EMIT multiArg(QStringLiteral("YAY!"), 42, this); + Q_EMIT privateVoid(QPrivateSignal{}); + Q_EMIT privateSingleArg(QStringLiteral("YAY!"), QPrivateSignal{}); + Q_EMIT privateMultiArg(QStringLiteral("YAY!"), 42, this, QPrivateSignal{}); } Q_SIGNALS: void voidSignal(); void singleArg(const QString &); void multiArg(const QString &, int, QObject *); + void privateVoid(QPrivateSignal); + void privateSingleArg(const QString &, QPrivateSignal); + void privateMultiArg(const QString &, int, QObject *, QPrivateSignal); }; class MultiSignalTest : public SignalTest { @@ -218,6 +224,34 @@ class QCoroSignalTest : public QCoro::TestObject { QCORO_COMPARE(result, QStringLiteral("YAY!YAY!")); } + QCoro::Task<> testVoidQPrivateSignal_coro(QCoro::TestContext) { + SignalTest obj; + + const auto result = co_await qCoro(&obj, &SignalTest::privateVoid); + static_assert(std::is_same_v>); + Q_UNUSED(result); + } + + QCoro::Task<> testSingleArgQPrivateSignal_coro(QCoro::TestContext) { + SignalTest obj; + + const auto result = co_await qCoro(&obj, &SignalTest::privateSingleArg); + static_assert(std::is_same_v); + QCORO_COMPARE(result, QStringLiteral("YAY!")); + } + + QCoro::Task<> testMultiArgQPrivateSignal_coro(QCoro::TestContext) { + SignalTest obj; + + const auto [str, num, ptr] = co_await qCoro(&obj, &SignalTest::privateMultiArg); + static_assert(std::is_same_v); + static_assert(std::is_same_v); + static_assert(std::is_same_v); + QCORO_COMPARE(str, QStringLiteral("YAY!")); + QCORO_COMPARE(num, 42); + QCORO_COMPARE(ptr, &obj); + } + QCoro::Task<> testSignalListenerVoid_coro(QCoro::TestContext) { MultiSignalTest obj; @@ -310,6 +344,56 @@ class QCoroSignalTest : public QCoro::TestObject { QCORO_COMPARE(co_await msg2, 2); } + QCoro::Task<> testSignalListenerQPrivateSignalVoid_coro(QCoro::TestContext) { + MultiSignalTest obj; + + auto generator = qCoroSignalListener(&obj, &MultiSignalTest::privateVoid); + int count = 0; + QCORO_FOREACH(const auto &value, generator) { + static_assert(std::is_same_v &>); + Q_UNUSED(value); + if (++count == 10) { + break; + } + } + + QCORO_COMPARE(count, 10); + } + + QCoro::Task<> testSignalListenerQPrivateSignalValue_coro(QCoro::TestContext) { + MultiSignalTest obj; + + auto generator = qCoroSignalListener(&obj, &MultiSignalTest::privateSingleArg); + int count = 0; + QCORO_FOREACH(const auto &value, generator) { + static_assert(std::is_same_v); + QCORO_COMPARE(value, QStringLiteral("YAY!")); + if (++count == 10) { + break; + } + } + + QCORO_COMPARE(count, 10); + } + + QCoro::Task<> testSignalListenerQPrivateSignalTuple_coro(QCoro::TestContext) { + MultiSignalTest obj; + + auto generator = qCoroSignalListener(&obj, &MultiSignalTest::privateMultiArg); + int count = 0; + QCORO_FOREACH(const auto &value, generator) { + static_assert(std::is_same_v &>); + QCORO_COMPARE(std::get(value), QStringLiteral("YAY!")); + QCORO_COMPARE(std::get(value), 42); + QCORO_COMPARE(std::get(value), &obj); + if (++count == 10) { + break; + } + } + + QCORO_COMPARE(count, 10); + } + private Q_SLOTS: addTest(Triggers) addTest(ReturnsValue) @@ -321,6 +405,9 @@ private Q_SLOTS: addTest(TimeoutTuple) addTest(TimeoutTriggersTuple) addTest(ThenChained) + addTest(VoidQPrivateSignal) + addTest(SingleArgQPrivateSignal) + addTest(MultiArgQPrivateSignal) addThenTest(Triggers) addThenTest(ReturnsValue) addThenTest(ReturnsTuple) @@ -330,6 +417,9 @@ private Q_SLOTS: addTest(SignalListenerTimeout) addTest(SignalListenerQueue) addTest(SignalAfterListenerQuits) + addTest(SignalListenerQPrivateSignalVoid) + addTest(SignalListenerQPrivateSignalValue) + addTest(SignalListenerQPrivateSignalTuple) }; QTEST_GUILESS_MAIN(QCoroSignalTest) diff --git a/tests/qcorotask.cpp b/tests/qcorotask.cpp index c54aedb..6557133 100644 --- a/tests/qcorotask.cpp +++ b/tests/qcorotask.cpp @@ -595,6 +595,33 @@ private Q_SLOTS: QVERIFY(timer.elapsed() >= (90ms).count()); } + void testWaitForWithValueRethrowsException() { + const auto coro = []() -> QCoro::Task { + co_await timer(); + throw std::runtime_error("Exception"); + co_return 42; + }; + +#if QT_VERSION >= QT_VERSION_CHECK(6, 3, 0) + QVERIFY_THROWS_EXCEPTION(std::runtime_error, QCoro::waitFor(coro())); +#else + QVERIFY_EXCEPTION_THROWN(QCoro::waitFor(coro()), std::runtime_error); +#endif + } + + void testWaitForRethrowsException() { + const auto coro = []() -> QCoro::Task<> { + co_await timer(); + throw std::runtime_error("Exception"); + }; + +#if QT_VERSION >= QT_VERSION_CHECK(6, 3, 0) + QVERIFY_THROWS_EXCEPTION(std::runtime_error, QCoro::waitFor(coro())); +#else + QVERIFY_EXCEPTION_THROWN(QCoro::waitFor(coro()), std::runtime_error); +#endif + } + void testIgnoredVoidTaskResult() { QEventLoop el; From b3392eaf17cb6a43eab8169e96ce176f50145cb8 Mon Sep 17 00:00:00 2001 From: Tianyu Chen Date: Fri, 29 Dec 2023 11:33:36 +0800 Subject: [PATCH 2/2] Update symbols files --- debian/changelog | 6 ++++ debian/libqcoro5core0.symbols | 15 +------- debian/libqcoro6core0.symbols | 54 +++-------------------------- debian/libqcoro6dbus0.symbols | 7 +--- debian/libqcoro6network0.symbols | 24 ++----------- debian/libqcoro6qml0.symbols | 21 +++-------- debian/libqcoro6websockets0.symbols | 16 ++------- 7 files changed, 20 insertions(+), 123 deletions(-) diff --git a/debian/changelog b/debian/changelog index 85cbeb1..7c1c4d0 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,9 @@ +qcoro (0.10.0-1deepin1) unstable; urgency=medium + + * Update symbols files. + + -- Tianyu Chen Fri, 29 Dec 2023 12:21:47 +0800 + qcoro (0.10.0-1) unstable; urgency=medium * Team upload. diff --git a/debian/libqcoro5core0.symbols b/debian/libqcoro5core0.symbols index bab010b..d2643bc 100644 --- a/debian/libqcoro5core0.symbols +++ b/debian/libqcoro5core0.symbols @@ -1,4 +1,4 @@ -# SymbolsHelper-Confirmed: 0.10.0 amd64 i386 +# SymbolsHelper-Confirmed: 0.10.0 amd64 arm64 libQCoro5Core.so.0 libqcoro5core0 #MINVER# * Build-Depends-Package: qcoro-qt5-dev _ZGVZN9QtPrivate15ConnectionTypesINS_4ListIJiN8QProcess10ExitStatusEEEELb1EE5typesEvE1t@Base 0.5.0 @@ -20,16 +20,8 @@ libQCoro5Core.so.0 libqcoro5core0 #MINVER# _ZN5QCoro13ThreadContextD2Ev@Base 0.8.0 (optional=templinst)_ZN5QCoro4TaskI10QByteArrayED1Ev@Base 0.5.0 (optional=templinst)_ZN5QCoro4TaskI10QByteArrayED2Ev@Base 0.5.0 -#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskIN6QTimer14QPrivateSignalEED1Ev@Base 0.5.0 -#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskIN6QTimer14QPrivateSignalEED2Ev@Base 0.5.0 (optional=templinst)_ZN5QCoro4TaskISt5tupleIJEEED1Ev@Base 0.10.0 (optional=templinst)_ZN5QCoro4TaskISt5tupleIJEEED2Ev@Base 0.10.0 -#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskISt8optionalIN6QTimer14QPrivateSignalEEED1Ev@Base 0.5.0 -#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskISt8optionalIN6QTimer14QPrivateSignalEEED2Ev@Base 0.5.0 -#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskISt8optionalIN7QThread14QPrivateSignalEEED1Ev@Base 0.5.0 -#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskISt8optionalIN7QThread14QPrivateSignalEEED2Ev@Base 0.5.0 -#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskISt8optionalIN8QProcess14QPrivateSignalEEED1Ev@Base 0.5.0 -#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskISt8optionalIN8QProcess14QPrivateSignalEEED2Ev@Base 0.5.0 (optional=templinst)_ZN5QCoro4TaskISt8optionalISt5tupleIJEEEED1Ev@Base 0.10.0 (optional=templinst)_ZN5QCoro4TaskISt8optionalISt5tupleIJEEEED2Ev@Base 0.10.0 (optional=templinst)_ZN5QCoro4TaskISt8optionalISt5tupleIJiN8QProcess10ExitStatusEEEEED1Ev@Base 0.5.0 @@ -53,11 +45,7 @@ libQCoro5Core.so.0 libqcoro5core0 #MINVER# _ZN5QCoro6detail11QCoroThreadC1EP7QThread@Base 0.5.0 _ZN5QCoro6detail11QCoroThreadC2EP7QThread@Base 0.5.0 (optional=templinst)_ZN5QCoro6detail11TaskPromiseI10QByteArrayE19unhandled_exceptionEv@Base 0.5.0 -#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro6detail11TaskPromiseIN6QTimer14QPrivateSignalEE19unhandled_exceptionEv@Base 0.5.0 (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt5tupleIJEEE19unhandled_exceptionEv@Base 0.10.0 -#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalIN6QTimer14QPrivateSignalEEE19unhandled_exceptionEv@Base 0.5.0 -#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalIN7QThread14QPrivateSignalEEE19unhandled_exceptionEv@Base 0.5.0 -#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalIN8QProcess14QPrivateSignalEEE19unhandled_exceptionEv@Base 0.5.0 (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalISt5tupleIJEEEE19unhandled_exceptionEv@Base 0.10.0 (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalISt5tupleIJiN8QProcess10ExitStatusEEEEE19unhandled_exceptionEv@Base 0.5.0 (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalIbEE19unhandled_exceptionEv@Base 0.5.0 @@ -172,7 +160,6 @@ libQCoro5Core.so.0 libqcoro5core0 #MINVER# _ZNSt19bad_optional_accessD1Ev@Base 0.5.0 _ZNSt19bad_optional_accessD2Ev@Base 0.5.0 (optional=templinst)_ZNSt8__detail9__variant16_Variant_storageILb0EJSt9monostate10QByteArrayNSt15__exception_ptr13exception_ptrEEE8_M_resetEv@Base 0.5.0 -#MISSING: 0.10.0# (optional=templinst)_ZNSt8__detail9__variant16_Variant_storageILb0EJSt9monostateSt8optionalIN7QThread14QPrivateSignalEENSt15__exception_ptr13exception_ptrEEE8_M_resetEv@Base 0.5.0 (optional=templinst)_ZNSt8__detail9__variant16_Variant_storageILb0EJSt9monostateSt8optionalISt5tupleIJEEENSt15__exception_ptr13exception_ptrEEE8_M_resetEv@Base 0.10.0 (optional=templinst)_ZNSt8__detail9__variant16_Variant_storageILb0EJSt9monostateSt8optionalIbENSt15__exception_ptr13exception_ptrEEE8_M_resetEv@Base 0.5.0 (optional=templinst)_ZNSt8__detail9__variant16_Variant_storageILb0EJSt9monostateSt8optionalIxENSt15__exception_ptr13exception_ptrEEE8_M_resetEv@Base 0.5.0 diff --git a/debian/libqcoro6core0.symbols b/debian/libqcoro6core0.symbols index 58fd864..10d0af5 100644 --- a/debian/libqcoro6core0.symbols +++ b/debian/libqcoro6core0.symbols @@ -1,10 +1,8 @@ -# SymbolsHelper-Confirmed: 0.10.0 amd64 i386 +# SymbolsHelper-Confirmed: 0.10.0 amd64 arm64 libQCoro6Core.so.0 libqcoro6core0 #MINVER# * Build-Depends-Package: qcoro-qt6-dev (optional=templinst)_Z41qRegisterNormalizedMetaTypeImplementationIN8QProcess10ExitStatusEEiRK10QByteArray@Base 0.7.0 _ZGVZN9QtPrivate15ConnectionTypesINS_4ListIJiN8QProcess10ExitStatusEEEELb1EE5typesEvE1t@Base 0.5.0 -#MISSING: 0.9.0# (optional=templinst)_ZN12QMetaTypeId2IbE11nameAsArrayE@Base 0.5.0 -#MISSING: 0.9.0# (optional=templinst)_ZN12QMetaTypeId2IxE11nameAsArrayE@Base 0.5.0 (optional=templinst)_ZN12QWeakPointerI7QObjectED1Ev@Base 0.5.0 (optional=templinst)_ZN12QWeakPointerI7QObjectED2Ev@Base 0.5.0 (optional=templinst)_ZN12QWeakPointerIK7QObjectED1Ev@Base 0.5.0 @@ -21,16 +19,8 @@ libQCoro6Core.so.0 libqcoro6core0 #MINVER# _ZN5QCoro13ThreadContextD2Ev@Base 0.8.0 (optional=templinst)_ZN5QCoro4TaskI10QByteArrayED1Ev@Base 0.5.0 (optional=templinst)_ZN5QCoro4TaskI10QByteArrayED2Ev@Base 0.5.0 -#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskIN6QTimer14QPrivateSignalEED1Ev@Base 0.5.0 -#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskIN6QTimer14QPrivateSignalEED2Ev@Base 0.5.0 (optional=templinst)_ZN5QCoro4TaskISt5tupleIJEEED1Ev@Base 0.10.0 (optional=templinst)_ZN5QCoro4TaskISt5tupleIJEEED2Ev@Base 0.10.0 -#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskISt8optionalIN6QTimer14QPrivateSignalEEED1Ev@Base 0.5.0 -#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskISt8optionalIN6QTimer14QPrivateSignalEEED2Ev@Base 0.5.0 -#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskISt8optionalIN7QThread14QPrivateSignalEEED1Ev@Base 0.5.0 -#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskISt8optionalIN7QThread14QPrivateSignalEEED2Ev@Base 0.5.0 -#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskISt8optionalIN8QProcess14QPrivateSignalEEED1Ev@Base 0.5.0 -#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro4TaskISt8optionalIN8QProcess14QPrivateSignalEEED2Ev@Base 0.5.0 (optional=templinst)_ZN5QCoro4TaskISt8optionalISt5tupleIJEEEED1Ev@Base 0.10.0 (optional=templinst)_ZN5QCoro4TaskISt8optionalISt5tupleIJEEEED2Ev@Base 0.10.0 (optional=templinst)_ZN5QCoro4TaskISt8optionalISt5tupleIJiN8QProcess10ExitStatusEEEEED1Ev@Base 0.5.0 @@ -54,11 +44,7 @@ libQCoro6Core.so.0 libqcoro6core0 #MINVER# _ZN5QCoro6detail11QCoroThreadC1EP7QThread@Base 0.5.0 _ZN5QCoro6detail11QCoroThreadC2EP7QThread@Base 0.5.0 (optional=templinst)_ZN5QCoro6detail11TaskPromiseI10QByteArrayE19unhandled_exceptionEv@Base 0.5.0 -#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro6detail11TaskPromiseIN6QTimer14QPrivateSignalEE19unhandled_exceptionEv@Base 0.5.0 (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt5tupleIJEEE19unhandled_exceptionEv@Base 0.10.0 -#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalIN6QTimer14QPrivateSignalEEE19unhandled_exceptionEv@Base 0.5.0 -#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalIN7QThread14QPrivateSignalEEE19unhandled_exceptionEv@Base 0.5.0 -#MISSING: 0.10.0# (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalIN8QProcess14QPrivateSignalEEE19unhandled_exceptionEv@Base 0.5.0 (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalISt5tupleIJEEEE19unhandled_exceptionEv@Base 0.10.0 (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalISt5tupleIJiN8QProcess10ExitStatusEEEEE19unhandled_exceptionEv@Base 0.5.0 (optional=templinst)_ZN5QCoro6detail11TaskPromiseISt8optionalIbEE19unhandled_exceptionEv@Base 0.5.0 @@ -139,42 +125,20 @@ libQCoro6Core.so.0 libqcoro6core0 #MINVER# _ZN5QCoro6detail16WaitSignalHelperD0Ev@Base 0.5.0 _ZN5QCoro6detail16WaitSignalHelperD1Ev@Base 0.5.0 _ZN5QCoro6detail16WaitSignalHelperD2Ev@Base 0.5.0 - (optional=templinst)_ZN9QtPrivate11QSlotObjectIMN5QCoro6detail16WaitSignalHelperEFvxENS_4ListIJxEEEvE4implEiPNS_15QSlotObjectBaseEP7QObjectPPvPb@Base 0.5.0 _ZN9QtPrivate16QMetaTypeForTypeIN5QCoro6detail13ContextHelperEE4nameE@Base 0.8.0 _ZN9QtPrivate16QMetaTypeForTypeIN5QCoro6detail16WaitSignalHelperEE4nameE@Base 0.5.0 _ZN9QtPrivate16QMetaTypeForTypeIN8QProcess10ExitStatusEE4nameE@Base 0.5.0 + (optional=templinst)_ZN9QtPrivate17MetaObjectForTypeIN5QCoro6detail13ContextHelperEvE18metaObjectFunctionEPKNS_18QMetaTypeInterfaceE@Base 0.10.0 + (optional=templinst)_ZN9QtPrivate17MetaObjectForTypeIN5QCoro6detail16WaitSignalHelperEvE18metaObjectFunctionEPKNS_18QMetaTypeInterfaceE@Base 0.10.0 (optional=templinst)_ZN9QtPrivate17MetaObjectForTypeIN8QProcess10ExitStatusEvE18metaObjectFunctionEPKNS_18QMetaTypeInterfaceE@Base 0.5.0 - (optional=templinst)_ZN9QtPrivate18QFunctorSlotObjectISt5_BindIFMN5QCoro6detail13QCoroIODevice13OperationBaseEFvNSt7__n486116coroutine_handleIvEEEPNS4_13ReadOperationES8_EELi0ENS_4ListIJEEEvE4implEiPNS_15QSlotObjectBaseEP7QObjectPPvPb@Base 0.4.0 - _ZN9QtPrivate18QFunctorSlotObjectIZN5QCoro6detail11QCoroSignalI6QTimerMS4_FvNS4_14QPrivateSignalEEE15setupConnectionEvEUlDpOT_E_Li1ENS_4ListIJS5_EEEvE4implEiPNS_15QSlotObjectBaseEP7QObjectPPvPb@Base 0.6.0 - _ZN9QtPrivate18QFunctorSlotObjectIZN5QCoro6detail11QCoroSignalI7QThreadMS4_FvNS4_14QPrivateSignalEEE15setupConnectionEvEUlDpOT_E_Li1ENS_4ListIJS5_EEEvE4implEiPNS_15QSlotObjectBaseEP7QObjectPPvPb@Base 0.6.0 - _ZN9QtPrivate18QFunctorSlotObjectIZN5QCoro6detail11QCoroSignalIK8QProcessMS4_FvNS4_14QPrivateSignalEEE15setupConnectionEvEUlDpOT_E_Li1ENS_4ListIJS6_EEEvE4implEiPNS_15QSlotObjectBaseEP7QObjectPPvPb@Base 0.6.0 - _ZN9QtPrivate18QFunctorSlotObjectIZN5QCoro6detail11QCoroSignalIK8QProcessMS4_FviNS4_10ExitStatusEEE15setupConnectionEvEUlDpOT_E_Li2ENS_4ListIJiS6_EEEvE4implEiPNS_15QSlotObjectBaseEP7QObjectPPvPb@Base 0.6.0 - _ZN9QtPrivate18QFunctorSlotObjectIZN5QCoro6detail11QCoroSignalINS2_16WaitSignalHelperEMS4_FvbEE15setupConnectionEvEUlDpOT_E_Li1ENS_4ListIJbEEEvE4implEiPNS_15QSlotObjectBaseEP7QObjectPPvPb@Base 0.6.0 - _ZN9QtPrivate18QFunctorSlotObjectIZN5QCoro6detail11QCoroSignalINS2_16WaitSignalHelperEMS4_FvxEE15setupConnectionEvEUlDpOT_E_Li1ENS_4ListIJxEEEvE4implEiPNS_15QSlotObjectBaseEP7QObjectPPvPb@Base 0.6.0 - (optional=templinst)_ZN9QtPrivate18QFunctorSlotObjectIZN5QCoro6detail15QCoroSignalBaseI6QTimerMS4_FvNS4_14QPrivateSignalEEE13handleTimeoutENSt7__n486116coroutine_handleIvEEEUlvE_Li0ENS_4ListIJEEEvE4implEiPNS_15QSlotObjectBaseEP7QObjectPPvPb@Base 0.6.0 - (optional=templinst)_ZN9QtPrivate18QFunctorSlotObjectIZN5QCoro6detail15QCoroSignalBaseI7QThreadMS4_FvNS4_14QPrivateSignalEEE13handleTimeoutENSt7__n486116coroutine_handleIvEEEUlvE_Li0ENS_4ListIJEEEvE4implEiPNS_15QSlotObjectBaseEP7QObjectPPvPb@Base 0.6.0 - (optional=templinst)_ZN9QtPrivate18QFunctorSlotObjectIZN5QCoro6detail15QCoroSignalBaseIK8QProcessMS4_FvNS4_14QPrivateSignalEEE13handleTimeoutENSt7__n486116coroutine_handleIvEEEUlvE_Li0ENS_4ListIJEEEvE4implEiPNS_15QSlotObjectBaseEP7QObjectPPvPb@Base 0.6.0 - (optional=templinst)_ZN9QtPrivate18QFunctorSlotObjectIZN5QCoro6detail15QCoroSignalBaseIK8QProcessMS4_FviNS4_10ExitStatusEEE13handleTimeoutENSt7__n486116coroutine_handleIvEEEUlvE_Li0ENS_4ListIJEEEvE4implEiPNS_15QSlotObjectBaseEP7QObjectPPvPb@Base 0.6.0 - (optional=templinst)_ZN9QtPrivate18QFunctorSlotObjectIZN5QCoro6detail15QCoroSignalBaseINS2_16WaitSignalHelperEMS4_FvbEE13handleTimeoutENSt7__n486116coroutine_handleIvEEEUlvE_Li0ENS_4ListIJEEEvE4implEiPNS_15QSlotObjectBaseEP7QObjectPPvPb@Base 0.6.0 - (optional=templinst)_ZN9QtPrivate18QFunctorSlotObjectIZN5QCoro6detail15QCoroSignalBaseINS2_16WaitSignalHelperEMS4_FvxEE13handleTimeoutENSt7__n486116coroutine_handleIvEEEUlvE_Li0ENS_4ListIJEEEvE4implEiPNS_15QSlotObjectBaseEP7QObjectPPvPb@Base 0.6.0 (optional=templinst)_ZN9QtPrivate24QEqualityOperatorForTypeIN8QProcess10ExitStatusELb1EE6equalsEPKNS_18QMetaTypeInterfaceEPKvS8_@Base 0.5.0 -#MISSING: 0.9.0# (optional=templinst)_ZN9QtPrivate24QEqualityOperatorForTypeIbLb1EE6equalsEPKNS_18QMetaTypeInterfaceEPKvS6_@Base 0.5.0 -#MISSING: 0.9.0# (optional=templinst)_ZN9QtPrivate24QEqualityOperatorForTypeIxLb1EE6equalsEPKNS_18QMetaTypeInterfaceEPKvS6_@Base 0.5.0 (optional=templinst)_ZN9QtPrivate24QLessThanOperatorForTypeIN8QProcess10ExitStatusELb1EE8lessThanEPKNS_18QMetaTypeInterfaceEPKvS8_@Base 0.5.0 -#MISSING: 0.9.0# (optional=templinst)_ZN9QtPrivate24QLessThanOperatorForTypeIbLb1EE8lessThanEPKNS_18QMetaTypeInterfaceEPKvS6_@Base 0.5.0 -#MISSING: 0.9.0# (optional=templinst)_ZN9QtPrivate24QLessThanOperatorForTypeIxLb1EE8lessThanEPKNS_18QMetaTypeInterfaceEPKvS6_@Base 0.5.0 _ZN9QtPrivate25QMetaTypeInterfaceWrapperIN5QCoro6detail13ContextHelperEE8metaTypeE@Base 0.8.0 _ZN9QtPrivate25QMetaTypeInterfaceWrapperIN5QCoro6detail16WaitSignalHelperEE8metaTypeE@Base 0.5.0 _ZN9QtPrivate25QMetaTypeInterfaceWrapperIN8QProcess10ExitStatusEE8metaTypeE@Base 0.5.0 -#MISSING: 0.9.0# (optional=templinst)_ZN9QtPrivate25QMetaTypeInterfaceWrapperIbE8metaTypeE@Base 0.5.0 -#MISSING: 0.9.0# (optional=templinst)_ZN9QtPrivate25QMetaTypeInterfaceWrapperIxE8metaTypeE@Base 0.5.0 + _ZN9QtPrivate25QMetaTypeInterfaceWrapperIvE8metaTypeE@Base 0.10.0 (optional=templinst)_ZN9QtPrivate26QDataStreamOperatorForTypeIN8QProcess10ExitStatusELb1EE12dataStreamInEPKNS_18QMetaTypeInterfaceER11QDataStreamPv@Base 0.5.0 (optional=templinst)_ZN9QtPrivate26QDataStreamOperatorForTypeIN8QProcess10ExitStatusELb1EE13dataStreamOutEPKNS_18QMetaTypeInterfaceER11QDataStreamPKv@Base 0.5.0 -#MISSING: 0.9.0# (optional=templinst)_ZN9QtPrivate26QDataStreamOperatorForTypeIbLb1EE12dataStreamInEPKNS_18QMetaTypeInterfaceER11QDataStreamPv@Base 0.5.0 -#MISSING: 0.9.0# (optional=templinst)_ZN9QtPrivate26QDataStreamOperatorForTypeIbLb1EE13dataStreamOutEPKNS_18QMetaTypeInterfaceER11QDataStreamPKv@Base 0.5.0 -#MISSING: 0.9.0# (optional=templinst)_ZN9QtPrivate26QDataStreamOperatorForTypeIxLb1EE12dataStreamInEPKNS_18QMetaTypeInterfaceER11QDataStreamPv@Base 0.5.0 -#MISSING: 0.9.0# (optional=templinst)_ZN9QtPrivate26QDataStreamOperatorForTypeIxLb1EE13dataStreamOutEPKNS_18QMetaTypeInterfaceER11QDataStreamPKv@Base 0.5.0 -#MISSING: 0.10.0# (optional=templinst)_ZN9QtPrivate27QDebugStreamOperatorForTypeIN8QProcess10ExitStatusELb1EE11debugStreamEPKNS_18QMetaTypeInterfaceER6QDebugPKv@Base 0.5.0 _ZNK5QCoro13ThreadContext11await_readyEv@Base 0.8.0 _ZNK5QCoro6detail10QCoroTimer14waitForTimeoutEv@Base 0.4.0 _ZNK5QCoro6detail10QCoroTimer23WaitForTimeoutOperation11await_readyEv@Base 0.4.0 @@ -195,7 +159,6 @@ libQCoro6Core.so.0 libqcoro6core0 #MINVER# _ZNSt19bad_optional_accessD1Ev@Base 0.5.0 _ZNSt19bad_optional_accessD2Ev@Base 0.5.0 (optional=templinst)_ZNSt8__detail9__variant16_Variant_storageILb0EJSt9monostate10QByteArrayNSt15__exception_ptr13exception_ptrEEE8_M_resetEv@Base 0.5.0 -#MISSING: 0.10.0# (optional=templinst)_ZNSt8__detail9__variant16_Variant_storageILb0EJSt9monostateSt8optionalIN7QThread14QPrivateSignalEENSt15__exception_ptr13exception_ptrEEE8_M_resetEv@Base 0.5.0 (optional=templinst)_ZNSt8__detail9__variant16_Variant_storageILb0EJSt9monostateSt8optionalISt5tupleIJEEENSt15__exception_ptr13exception_ptrEEE8_M_resetEv@Base 0.10.0 (optional=templinst)_ZNSt8__detail9__variant16_Variant_storageILb0EJSt9monostateSt8optionalIbENSt15__exception_ptr13exception_ptrEEE8_M_resetEv@Base 0.5.0 (optional=templinst)_ZNSt8__detail9__variant16_Variant_storageILb0EJSt9monostateSt8optionalIxENSt15__exception_ptr13exception_ptrEEE8_M_resetEv@Base 0.5.0 @@ -235,13 +198,4 @@ libQCoro6Core.so.0 libqcoro6core0 #MINVER# (optional=templinst)_ZZN9QtPrivate15ConnectionTypesINS_4ListIJxEEELb1EE5typesEvE1t@Base 0.5.0 (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIN5QCoro6detail13ContextHelperEE7getDtorEvENUlPKNS_18QMetaTypeInterfaceEPvE_4_FUNES7_S8_@Base 0.8.0 (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIN5QCoro6detail16WaitSignalHelperEE7getDtorEvENUlPKNS_18QMetaTypeInterfaceEPvE_4_FUNES7_S8_@Base 0.5.0 - (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIN8QProcess10ExitStatusEE10getCopyCtrEvENUlPKNS_18QMetaTypeInterfaceEPvPKvE_4_FUNES6_S7_S9_@Base 0.5.0 - (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIN8QProcess10ExitStatusEE10getMoveCtrEvENUlPKNS_18QMetaTypeInterfaceEPvS7_E_4_FUNES6_S7_S7_@Base 0.5.0 - (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIN8QProcess10ExitStatusEE13getDefaultCtrEvENUlPKNS_18QMetaTypeInterfaceEPvE_4_FUNES6_S7_@Base 0.5.0 (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIN8QProcess10ExitStatusEE17getLegacyRegisterEvENUlvE_4_FUNEv@Base 0.5.0 -#MISSING: 0.9.0# (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIbE10getCopyCtrEvENUlPKNS_18QMetaTypeInterfaceEPvPKvE_4_FUNES4_S5_S7_@Base 0.5.0 -#MISSING: 0.9.0# (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIbE10getMoveCtrEvENUlPKNS_18QMetaTypeInterfaceEPvS5_E_4_FUNES4_S5_S5_@Base 0.5.0 -#MISSING: 0.9.0# (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIbE13getDefaultCtrEvENUlPKNS_18QMetaTypeInterfaceEPvE_4_FUNES4_S5_@Base 0.5.0 -#MISSING: 0.9.0# (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIxE10getCopyCtrEvENUlPKNS_18QMetaTypeInterfaceEPvPKvE_4_FUNES4_S5_S7_@Base 0.5.0 -#MISSING: 0.9.0# (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIxE10getMoveCtrEvENUlPKNS_18QMetaTypeInterfaceEPvS5_E_4_FUNES4_S5_S5_@Base 0.5.0 -#MISSING: 0.9.0# (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIxE13getDefaultCtrEvENUlPKNS_18QMetaTypeInterfaceEPvE_4_FUNES4_S5_@Base 0.5.0 diff --git a/debian/libqcoro6dbus0.symbols b/debian/libqcoro6dbus0.symbols index 6bd8e5e..200556c 100644 --- a/debian/libqcoro6dbus0.symbols +++ b/debian/libqcoro6dbus0.symbols @@ -1,4 +1,4 @@ -# SymbolsHelper-Confirmed: 0.9.0 amd64 i386 +# SymbolsHelper-Confirmed: 0.10.0 amd64 arm64 libQCoro6DBus.so.0 libqcoro6dbus0 #MINVER# * Build-Depends-Package: qcoro-qt6-dev (optional=templinst)_Z41qRegisterNormalizedMetaTypeImplementationIP23QDBusPendingCallWatcherEiRK10QByteArray@Base 0.7.0 @@ -22,8 +22,6 @@ libQCoro6DBus.so.0 libqcoro6dbus0 #MINVER# _ZN5QCoro6detail20QCoroDBusPendingCallC2ERK16QDBusPendingCall@Base 0.4.0 _ZN9QtPrivate16QMetaTypeForTypeIP23QDBusPendingCallWatcherE4nameE@Base 0.5.0 (optional=templinst)_ZN9QtPrivate17MetaObjectForTypeIP23QDBusPendingCallWatchervE18metaObjectFunctionEPKNS_18QMetaTypeInterfaceE@Base 0.5.0 - _ZN9QtPrivate18QFunctorSlotObjectIZN5QCoro6detail11QCoroSignalI23QDBusPendingCallWatcherMS4_FvPS4_EE15setupConnectionEvEUlDpOT_E_Li1ENS_4ListIJS5_EEEvE4implEiPNS_15QSlotObjectBaseEP7QObjectPPvPb@Base 0.6.0 - (optional=templinst)_ZN9QtPrivate18QFunctorSlotObjectIZN5QCoro6detail15QCoroSignalBaseI23QDBusPendingCallWatcherMS4_FvPS4_EE13handleTimeoutENSt7__n486116coroutine_handleIvEEEUlvE_Li0ENS_4ListIJEEEvE4implEiPNS_15QSlotObjectBaseEP7QObjectPPvPb@Base 0.6.0 _ZN9QtPrivate25QMetaTypeInterfaceWrapperIP23QDBusPendingCallWatcherE8metaTypeE@Base 0.5.0 _ZNK5QCoro6detail20QCoroDBusPendingCall24WaitForFinishedOperation11await_readyEv@Base 0.4.0 _ZNK5QCoro6detail20QCoroDBusPendingCall24WaitForFinishedOperation12await_resumeEv@Base 0.4.0 @@ -40,7 +38,4 @@ libQCoro6DBus.so.0 libqcoro6dbus0 #MINVER# _ZTVSt18bad_variant_access@Base 0.5.0 (optional=templinst)_ZZN18QMetaTypeIdQObjectIP23QDBusPendingCallWatcherLi8EE14qt_metatype_idEvE11metatype_id@Base 0.5.0 (optional=templinst)_ZZN9QtPrivate15ConnectionTypesINS_4ListIJP23QDBusPendingCallWatcherEEELb1EE5typesEvE1t@Base 0.5.0 - (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIP23QDBusPendingCallWatcherE10getCopyCtrEvENUlPKNS_18QMetaTypeInterfaceEPvPKvE_4_FUNES6_S7_S9_@Base 0.5.0 - (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIP23QDBusPendingCallWatcherE10getMoveCtrEvENUlPKNS_18QMetaTypeInterfaceEPvS7_E_4_FUNES6_S7_S7_@Base 0.5.0 - (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIP23QDBusPendingCallWatcherE13getDefaultCtrEvENUlPKNS_18QMetaTypeInterfaceEPvE_4_FUNES6_S7_@Base 0.5.0 (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIP23QDBusPendingCallWatcherE17getLegacyRegisterEvENUlvE_4_FUNEv@Base 0.5.0 diff --git a/debian/libqcoro6network0.symbols b/debian/libqcoro6network0.symbols index f75270d..7074dfa 100644 --- a/debian/libqcoro6network0.symbols +++ b/debian/libqcoro6network0.symbols @@ -1,7 +1,6 @@ -# SymbolsHelper-Confirmed: 0.10.0 amd64 i386 +# SymbolsHelper-Confirmed: 0.10.0 amd64 arm64 libQCoro6Network.so.0 libqcoro6network0 #MINVER# * Build-Depends-Package: qcoro-qt6-dev -#MISSING: 0.9.0# (optional=templinst)_ZN12QMetaTypeId2IbE11nameAsArrayE@Base 0.5.0 (optional=templinst)_ZN12QWeakPointerI7QObjectED1Ev@Base 0.4.0 (optional=templinst)_ZN12QWeakPointerI7QObjectED2Ev@Base 0.4.0 (optional=templinst)_ZN5QCoro4TaskISt8optionalISt5tupleIJEEEED1Ev@Base 0.5.0 @@ -64,23 +63,7 @@ libQCoro6Network.so.0 libqcoro6network0 #MINVER# (subst)_ZN5QCoro6detail19QCoroAbstractSocket23waitForBytesWrittenImplENSt6chrono8durationI{int64_t}St5ratioIL{int64_t}1EL{int64_t}1000EEEE@Base 0.5.0 _ZN5QCoro6detail19QCoroAbstractSocketC1EP15QAbstractSocket@Base 0.4.0 _ZN5QCoro6detail19QCoroAbstractSocketC2EP15QAbstractSocket@Base 0.4.0 - (optional=templinst)_ZN9QtPrivate18QFunctorSlotObjectISt5_BindIFMN5QCoro6detail17WaitOperationBaseI10QTcpServerEEFvNSt7__n486116coroutine_handleIvEEEPNS3_14QCoroTcpServer29WaitForNewConnectionOperationES9_EELi0ENS_4ListIJEEEvE4implEiPNS_15QSlotObjectBaseEP7QObjectPPvPb@Base 0.4.0 - _ZN9QtPrivate18QFunctorSlotObjectIZN5QCoro6detail11QCoroSignalI10QTcpServerMS4_FvvEE15setupConnectionEvEUlDpOT_E_Li0ENS_4ListIJEEEvE4implEiPNS_15QSlotObjectBaseEP7QObjectPPvPb@Base 0.6.0 - _ZN9QtPrivate18QFunctorSlotObjectIZN5QCoro6detail11QCoroSignalIK12QLocalSocketMS4_FvvEE15setupConnectionEvEUlDpOT_E_Li0ENS_4ListIJEEEvE4implEiPNS_15QSlotObjectBaseEP7QObjectPPvPb@Base 0.6.0 - _ZN9QtPrivate18QFunctorSlotObjectIZN5QCoro6detail11QCoroSignalIK13QNetworkReplyMS4_FvvEE15setupConnectionEvEUlDpOT_E_Li0ENS_4ListIJEEEvE4implEiPNS_15QSlotObjectBaseEP7QObjectPPvPb@Base 0.6.0 - _ZN9QtPrivate18QFunctorSlotObjectIZN5QCoro6detail11QCoroSignalIK15QAbstractSocketMS4_FvvEE15setupConnectionEvEUlDpOT_E_Li0ENS_4ListIJEEEvE4implEiPNS_15QSlotObjectBaseEP7QObjectPPvPb@Base 0.6.0 - (optional=templinst)_ZN9QtPrivate18QFunctorSlotObjectIZN5QCoro6detail15QCoroSignalBaseI10QTcpServerMS4_FvvEE13handleTimeoutENSt7__n486116coroutine_handleIvEEEUlvE_Li0ENS_4ListIJEEEvE4implEiPNS_15QSlotObjectBaseEP7QObjectPPvPb@Base 0.6.0 - (optional=templinst)_ZN9QtPrivate18QFunctorSlotObjectIZN5QCoro6detail15QCoroSignalBaseIK12QLocalSocketMS4_FvvEE13handleTimeoutENSt7__n486116coroutine_handleIvEEEUlvE_Li0ENS_4ListIJEEEvE4implEiPNS_15QSlotObjectBaseEP7QObjectPPvPb@Base 0.6.0 - (optional=templinst)_ZN9QtPrivate18QFunctorSlotObjectIZN5QCoro6detail15QCoroSignalBaseIK13QNetworkReplyMS4_FvvEE13handleTimeoutENSt7__n486116coroutine_handleIvEEEUlvE_Li0ENS_4ListIJEEEvE4implEiPNS_15QSlotObjectBaseEP7QObjectPPvPb@Base 0.6.0 - (optional=templinst)_ZN9QtPrivate18QFunctorSlotObjectIZN5QCoro6detail15QCoroSignalBaseIK15QAbstractSocketMS4_FvvEE13handleTimeoutENSt7__n486116coroutine_handleIvEEEUlvE_Li0ENS_4ListIJEEEvE4implEiPNS_15QSlotObjectBaseEP7QObjectPPvPb@Base 0.6.0 - (optional=templinst)_ZN9QtPrivate18QFunctorSlotObjectIZN5QCoro6detail17WaitOperationBaseI10QTcpServerE17startTimeoutTimerENSt7__n486116coroutine_handleIvEEEUlvE_Li0ENS_4ListIJEEEvE4implEiPNS_15QSlotObjectBaseEP7QObjectPPvPb@Base 0.4.0 - (optional=templinst)_ZN9QtPrivate18QFunctorSlotObjectIZN5QCoro6detail17WaitOperationBaseI10QTcpServerE6resumeENSt7__n486116coroutine_handleIvEEEUlvE_Li0ENS_4ListIJEEEvE4implEiPNS_15QSlotObjectBaseEP7QObjectPPvPb@Base 0.4.0 -#MISSING: 0.9.0# (optional=templinst)_ZN9QtPrivate24QEqualityOperatorForTypeIbLb1EE6equalsEPKNS_18QMetaTypeInterfaceEPKvS6_@Base 0.5.0 -#MISSING: 0.9.0# (optional=templinst)_ZN9QtPrivate24QLessThanOperatorForTypeIbLb1EE8lessThanEPKNS_18QMetaTypeInterfaceEPKvS6_@Base 0.5.0 -#MISSING: 0.9.0# (optional=templinst)_ZN9QtPrivate25QMetaTypeInterfaceWrapperIbE8metaTypeE@Base 0.5.0 -#MISSING: 0.9.0# (optional=templinst)_ZN9QtPrivate26QDataStreamOperatorForTypeIbLb1EE12dataStreamInEPKNS_18QMetaTypeInterfaceER11QDataStreamPv@Base 0.5.0 -#MISSING: 0.9.0# (optional=templinst)_ZN9QtPrivate26QDataStreamOperatorForTypeIbLb1EE13dataStreamOutEPKNS_18QMetaTypeInterfaceER11QDataStreamPKv@Base 0.5.0 -#MISSING: 0.9.0# (optional=templinst)_ZN9QtPrivate27QDebugStreamOperatorForTypeIbLb1EE11debugStreamEPKNS_18QMetaTypeInterfaceER6QDebugPKv@Base 0.5.0 + _ZN9QtPrivate25QMetaTypeInterfaceWrapperIvE8metaTypeE@Base 0.10.0 _ZNK5QCoro6detail14QCoroTcpServer29WaitForNewConnectionOperation11await_readyEv@Base 0.4.0 _ZNK5QCoro6detail17QCoroNetworkReply24WaitForFinishedOperation11await_readyEv@Base 0.4.0 _ZNK5QCoro6detail17QCoroNetworkReply24WaitForFinishedOperation12await_resumeEv@Base 0.4.0 @@ -112,6 +95,3 @@ libQCoro6Network.so.0 libqcoro6network0 #MINVER# _ZTVSt18bad_variant_access@Base 0.5.0 (optional=templinst)_ZZN9QtPrivate15ConnectionTypesINS_4ListIJbEEELb1EE5typesEvE1t@Base 0.5.0 (optional=templinst)_ZZN9QtPrivate15ConnectionTypesINS_4ListIJxEEELb1EE5typesEvE1t@Base 0.5.0 -#MISSING: 0.9.0# (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIbE10getCopyCtrEvENUlPKNS_18QMetaTypeInterfaceEPvPKvE_4_FUNES4_S5_S7_@Base 0.5.0 -#MISSING: 0.9.0# (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIbE10getMoveCtrEvENUlPKNS_18QMetaTypeInterfaceEPvS5_E_4_FUNES4_S5_S5_@Base 0.5.0 -#MISSING: 0.9.0# (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIbE13getDefaultCtrEvENUlPKNS_18QMetaTypeInterfaceEPvE_4_FUNES4_S5_@Base 0.5.0 diff --git a/debian/libqcoro6qml0.symbols b/debian/libqcoro6qml0.symbols index 446060a..84fc48f 100644 --- a/debian/libqcoro6qml0.symbols +++ b/debian/libqcoro6qml0.symbols @@ -1,10 +1,9 @@ -# SymbolsHelper-Confirmed: 0.10.0 amd64 i386 +# SymbolsHelper-Confirmed: 0.10.0 amd64 arm64 libQCoro6Qml.so.0 libqcoro6qml0 #MINVER# * Build-Depends-Package: qcoro-qt6-dev (optional=templinst)_Z41qRegisterNormalizedMetaTypeImplementationI8QJSValueEiRK10QByteArray@Base 0.7.0 (optional=templinst)_Z41qRegisterNormalizedMetaTypeImplementationIN5QCoro7QmlTaskEEiRK10QByteArray@Base 0.7.0 _Z8qcoroqmlv@Base 0.7.0 -#MISSING: 0.9.0# (optional=templinst)_ZN12QMetaTypeId2I8QVariantE11nameAsArrayE@Base 0.7.0 (optional=templinst)_ZN12QWeakPointerI7QObjectED1Ev@Base 0.9.0 (optional=templinst)_ZN12QWeakPointerI7QObjectED2Ev@Base 0.9.0 (optional=templinst)_ZN17QArrayDataPointerI8QJSValueED1Ev@Base 0.7.0 @@ -42,21 +41,18 @@ libQCoro6Qml.so.0 libqcoro6qml0 #MINVER# _ZN9QtPrivate16QMetaTypeForTypeIN5QCoro15QmlTaskListenerEE4nameE@Base 0.9.0 _ZN9QtPrivate16QMetaTypeForTypeIN5QCoro7QmlTaskEE4nameE@Base 0.7.0 _ZN9QtPrivate16QMetaTypeForTypeIPN5QCoro15QmlTaskListenerEE4nameE@Base 0.9.0 + (optional=templinst)_ZN9QtPrivate17MetaObjectForTypeIN5QCoro15QmlTaskListenerEvE18metaObjectFunctionEPKNS_18QMetaTypeInterfaceE@Base 0.10.0 (optional=templinst)_ZN9QtPrivate17MetaObjectForTypeIN5QCoro7QmlTaskEvE18metaObjectFunctionEPKNS_18QMetaTypeInterfaceE@Base 0.7.0 (optional=templinst)_ZN9QtPrivate17MetaObjectForTypeIPN5QCoro15QmlTaskListenerEvE18metaObjectFunctionEPKNS_18QMetaTypeInterfaceE@Base 0.9.0 (optional=templinst)_ZN9QtPrivate24QEqualityOperatorForTypeI16QQmlListPropertyIN5QCoro15QmlTaskListenerEELb1EE6equalsEPKNS_18QMetaTypeInterfaceEPKvSA_@Base 0.9.0 -#MISSING: 0.9.0# (optional=templinst)_ZN9QtPrivate24QEqualityOperatorForTypeI8QVariantLb1EE6equalsEPKNS_18QMetaTypeInterfaceEPKvS7_@Base 0.7.0 _ZN9QtPrivate25QMetaTypeInterfaceWrapperI16QQmlListPropertyIN5QCoro15QmlTaskListenerEEE8metaTypeE@Base 0.9.0 _ZN9QtPrivate25QMetaTypeInterfaceWrapperI8QJSValueE8metaTypeE@Base 0.7.0 -#MISSING: 0.9.0# (optional=templinst)_ZN9QtPrivate25QMetaTypeInterfaceWrapperI8QVariantE8metaTypeE@Base 0.7.0 _ZN9QtPrivate25QMetaTypeInterfaceWrapperIN5QCoro15QmlTaskListenerEE8metaTypeE@Base 0.9.0 _ZN9QtPrivate25QMetaTypeInterfaceWrapperIN5QCoro7QmlTaskEE8metaTypeE@Base 0.7.0 _ZN9QtPrivate25QMetaTypeInterfaceWrapperIPN5QCoro15QmlTaskListenerEE8metaTypeE@Base 0.9.0 + _ZN9QtPrivate25QMetaTypeInterfaceWrapperIvE8metaTypeE@Base 0.10.0 (optional=templinst)_ZN9QtPrivate26QDataStreamOperatorForTypeI8QJSValueLb1EE12dataStreamInEPKNS_18QMetaTypeInterfaceER11QDataStreamPv@Base 0.7.0 (optional=templinst)_ZN9QtPrivate26QDataStreamOperatorForTypeI8QJSValueLb1EE13dataStreamOutEPKNS_18QMetaTypeInterfaceER11QDataStreamPKv@Base 0.7.0 -#MISSING: 0.9.0# (optional=templinst)_ZN9QtPrivate26QDataStreamOperatorForTypeI8QVariantLb1EE12dataStreamInEPKNS_18QMetaTypeInterfaceER11QDataStreamPv@Base 0.7.0 -#MISSING: 0.9.0# (optional=templinst)_ZN9QtPrivate26QDataStreamOperatorForTypeI8QVariantLb1EE13dataStreamOutEPKNS_18QMetaTypeInterfaceER11QDataStreamPKv@Base 0.7.0 -#MISSING: 0.9.0# (optional=templinst)_ZN9QtPrivate27QDebugStreamOperatorForTypeI8QVariantLb1EE11debugStreamEPKNS_18QMetaTypeInterfaceER6QDebugPKv@Base 0.7.0 _ZNK5QCoro15QmlTaskListener10metaObjectEv@Base 0.9.0 _ZNK5QCoro15QmlTaskListener5valueEv@Base 0.9.0 _ZNKSt18bad_variant_access4whatEv@Base 0.7.0 @@ -64,7 +60,7 @@ libQCoro6Qml.so.0 libqcoro6qml0 #MINVER# _ZNSt18bad_variant_accessD1Ev@Base 0.7.0 _ZNSt18bad_variant_accessD2Ev@Base 0.7.0 _ZSt26__throw_bad_variant_accessPKc@Base 0.7.0 - (arch=amd64)_ZSt26__throw_bad_variant_accessb@Base 0.9.0 + _ZSt26__throw_bad_variant_accessb@Base 0.10.0 _ZTIN5QCoro15QmlTaskListenerE@Base 0.9.0 _ZTISt18bad_variant_access@Base 0.7.0 _ZTSN5QCoro15QmlTaskListenerE@Base 0.9.0 @@ -74,18 +70,12 @@ libQCoro6Qml.so.0 libqcoro6qml0 #MINVER# (optional=templinst)_ZZN11QMetaTypeIdI8QJSValueE14qt_metatype_idEvE11metatype_id@Base 0.7.0 (optional=templinst)_ZZN11QMetaTypeIdIN5QCoro7QmlTaskEE14qt_metatype_idEvE11metatype_id@Base 0.7.0 (optional=templinst)_ZZN18QMetaTypeIdQObjectIPN5QCoro15QmlTaskListenerELi8EE14qt_metatype_idEvE11metatype_id@Base 0.9.0 - (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeI16QQmlListPropertyIN5QCoro15QmlTaskListenerEEE10getCopyCtrEvENUlPKNS_18QMetaTypeInterfaceEPvPKvE_4_FUNES8_S9_SB_@Base 0.9.0 - (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeI16QQmlListPropertyIN5QCoro15QmlTaskListenerEEE10getMoveCtrEvENUlPKNS_18QMetaTypeInterfaceEPvS9_E_4_FUNES8_S9_S9_@Base 0.9.0 (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeI16QQmlListPropertyIN5QCoro15QmlTaskListenerEEE13getDefaultCtrEvENUlPKNS_18QMetaTypeInterfaceEPvE_4_FUNES8_S9_@Base 0.9.0 (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeI8QJSValueE10getCopyCtrEvENUlPKNS_18QMetaTypeInterfaceEPvPKvE_4_FUNES5_S6_S8_@Base 0.7.0 (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeI8QJSValueE10getMoveCtrEvENUlPKNS_18QMetaTypeInterfaceEPvS6_E_4_FUNES5_S6_S6_@Base 0.7.0 (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeI8QJSValueE13getDefaultCtrEvENUlPKNS_18QMetaTypeInterfaceEPvE_4_FUNES5_S6_@Base 0.7.0 (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeI8QJSValueE17getLegacyRegisterEvENUlvE_4_FUNEv@Base 0.7.0 (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeI8QJSValueE7getDtorEvENUlPKNS_18QMetaTypeInterfaceEPvE_4_FUNES5_S6_@Base 0.7.0 -#MISSING: 0.9.0# (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeI8QVariantE10getCopyCtrEvENUlPKNS_18QMetaTypeInterfaceEPvPKvE_4_FUNES5_S6_S8_@Base 0.7.0 -#MISSING: 0.9.0# (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeI8QVariantE10getMoveCtrEvENUlPKNS_18QMetaTypeInterfaceEPvS6_E_4_FUNES5_S6_S6_@Base 0.7.0 -#MISSING: 0.9.0# (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeI8QVariantE13getDefaultCtrEvENUlPKNS_18QMetaTypeInterfaceEPvE_4_FUNES5_S6_@Base 0.7.0 -#MISSING: 0.9.0# (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeI8QVariantE7getDtorEvENUlPKNS_18QMetaTypeInterfaceEPvE_4_FUNES5_S6_@Base 0.7.0 (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIN5QCoro15QmlTaskListenerEE13getDefaultCtrEvENUlPKNS_18QMetaTypeInterfaceEPvE_4_FUNES6_S7_@Base 0.9.0 (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIN5QCoro15QmlTaskListenerEE7getDtorEvENUlPKNS_18QMetaTypeInterfaceEPvE_4_FUNES6_S7_@Base 0.9.0 (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIN5QCoro7QmlTaskEE10getCopyCtrEvENUlPKNS_18QMetaTypeInterfaceEPvPKvE_4_FUNES6_S7_S9_@Base 0.7.0 @@ -93,7 +83,4 @@ libQCoro6Qml.so.0 libqcoro6qml0 #MINVER# (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIN5QCoro7QmlTaskEE13getDefaultCtrEvENUlPKNS_18QMetaTypeInterfaceEPvE_4_FUNES6_S7_@Base 0.7.0 (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIN5QCoro7QmlTaskEE17getLegacyRegisterEvENUlvE_4_FUNEv@Base 0.7.0 (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIN5QCoro7QmlTaskEE7getDtorEvENUlPKNS_18QMetaTypeInterfaceEPvE_4_FUNES6_S7_@Base 0.7.0 - (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIPN5QCoro15QmlTaskListenerEE10getCopyCtrEvENUlPKNS_18QMetaTypeInterfaceEPvPKvE_4_FUNES7_S8_SA_@Base 0.9.0 - (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIPN5QCoro15QmlTaskListenerEE10getMoveCtrEvENUlPKNS_18QMetaTypeInterfaceEPvS8_E_4_FUNES7_S8_S8_@Base 0.9.0 - (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIPN5QCoro15QmlTaskListenerEE13getDefaultCtrEvENUlPKNS_18QMetaTypeInterfaceEPvE_4_FUNES7_S8_@Base 0.9.0 (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIPN5QCoro15QmlTaskListenerEE17getLegacyRegisterEvENUlvE_4_FUNEv@Base 0.9.0 diff --git a/debian/libqcoro6websockets0.symbols b/debian/libqcoro6websockets0.symbols index 504270e..483e1e4 100644 --- a/debian/libqcoro6websockets0.symbols +++ b/debian/libqcoro6websockets0.symbols @@ -1,4 +1,4 @@ -# SymbolsHelper-Confirmed: 0.10.0 amd64 i386 +# SymbolsHelper-Confirmed: 0.10.0 amd64 arm64 libQCoro6WebSockets.so.0 libqcoro6websockets0 #MINVER# * Build-Depends-Package: qcoro-qt6-dev (optional=templinst)_Z41qRegisterNormalizedMetaTypeImplementationIP10QWebSocketEiRK10QByteArray@Base 0.7.0 @@ -18,7 +18,6 @@ libQCoro6WebSockets.so.0 libqcoro6websockets0 #MINVER# (optional=templinst)_ZN11QMetaTypeIdISt8optionalISt5tupleIJ7QStringEEEE14qt_metatype_idEv@Base 0.6.0 (optional=templinst)_ZN11QMetaTypeIdISt8optionalISt5tupleIJ7QStringbEEEE14qt_metatype_idEv@Base 0.6.0 (optional=templinst)_ZN11QMetaTypeIdISt8optionalISt5tupleIJx10QByteArrayEEEE14qt_metatype_idEv@Base 0.6.0 -#MISSING: 0.9.0# (optional=templinst)_ZN12QMetaTypeId2IbE11nameAsArrayE@Base 0.6.0 (optional=templinst)_ZN12QWeakPointerI7QObjectED1Ev@Base 0.6.0 (optional=templinst)_ZN12QWeakPointerI7QObjectED2Ev@Base 0.6.0 (optional=templinst)_ZN17QArrayDataPointerIDsED1Ev@Base 0.6.0 @@ -65,23 +64,18 @@ libQCoro6WebSockets.so.0 libqcoro6websockets0 #MINVER# (optional=templinst)_ZN9QtPrivate24QEqualityOperatorForTypeISt8optionalISt5tupleIJ7QStringEEELb1EE6equalsEPKNS_18QMetaTypeInterfaceEPKvSB_@Base 0.6.0 (optional=templinst)_ZN9QtPrivate24QEqualityOperatorForTypeISt8optionalISt5tupleIJ7QStringbEEELb1EE6equalsEPKNS_18QMetaTypeInterfaceEPKvSB_@Base 0.6.0 (optional=templinst)_ZN9QtPrivate24QEqualityOperatorForTypeISt8optionalISt5tupleIJx10QByteArrayEEELb1EE6equalsEPKNS_18QMetaTypeInterfaceEPKvSB_@Base 0.6.0 -#MISSING: 0.9.0# (optional=templinst)_ZN9QtPrivate24QEqualityOperatorForTypeIbLb1EE6equalsEPKNS_18QMetaTypeInterfaceEPKvS6_@Base 0.6.0 (optional=templinst)_ZN9QtPrivate24QLessThanOperatorForTypeISt8optionalISt5tupleIJ10QByteArrayEEELb1EE8lessThanEPKNS_18QMetaTypeInterfaceEPKvSB_@Base 0.6.0 (optional=templinst)_ZN9QtPrivate24QLessThanOperatorForTypeISt8optionalISt5tupleIJ10QByteArraybEEELb1EE8lessThanEPKNS_18QMetaTypeInterfaceEPKvSB_@Base 0.6.0 (optional=templinst)_ZN9QtPrivate24QLessThanOperatorForTypeISt8optionalISt5tupleIJ7QStringEEELb1EE8lessThanEPKNS_18QMetaTypeInterfaceEPKvSB_@Base 0.6.0 (optional=templinst)_ZN9QtPrivate24QLessThanOperatorForTypeISt8optionalISt5tupleIJ7QStringbEEELb1EE8lessThanEPKNS_18QMetaTypeInterfaceEPKvSB_@Base 0.6.0 (optional=templinst)_ZN9QtPrivate24QLessThanOperatorForTypeISt8optionalISt5tupleIJx10QByteArrayEEELb1EE8lessThanEPKNS_18QMetaTypeInterfaceEPKvSB_@Base 0.6.0 -#MISSING: 0.9.0# (optional=templinst)_ZN9QtPrivate24QLessThanOperatorForTypeIbLb1EE8lessThanEPKNS_18QMetaTypeInterfaceEPKvS6_@Base 0.6.0 _ZN9QtPrivate25QMetaTypeInterfaceWrapperIP10QWebSocketE8metaTypeE@Base 0.6.0 _ZN9QtPrivate25QMetaTypeInterfaceWrapperISt8optionalISt5tupleIJ10QByteArrayEEEE8metaTypeE@Base 0.6.0 _ZN9QtPrivate25QMetaTypeInterfaceWrapperISt8optionalISt5tupleIJ10QByteArraybEEEE8metaTypeE@Base 0.6.0 _ZN9QtPrivate25QMetaTypeInterfaceWrapperISt8optionalISt5tupleIJ7QStringEEEE8metaTypeE@Base 0.6.0 _ZN9QtPrivate25QMetaTypeInterfaceWrapperISt8optionalISt5tupleIJ7QStringbEEEE8metaTypeE@Base 0.6.0 _ZN9QtPrivate25QMetaTypeInterfaceWrapperISt8optionalISt5tupleIJx10QByteArrayEEEE8metaTypeE@Base 0.6.0 -#MISSING: 0.9.0# (optional=templinst)_ZN9QtPrivate25QMetaTypeInterfaceWrapperIbE8metaTypeE@Base 0.6.0 -#MISSING: 0.9.0# (optional=templinst)_ZN9QtPrivate26QDataStreamOperatorForTypeIbLb1EE12dataStreamInEPKNS_18QMetaTypeInterfaceER11QDataStreamPv@Base 0.6.0 -#MISSING: 0.9.0# (optional=templinst)_ZN9QtPrivate26QDataStreamOperatorForTypeIbLb1EE13dataStreamOutEPKNS_18QMetaTypeInterfaceER11QDataStreamPKv@Base 0.6.0 -#MISSING: 0.9.0# (optional=templinst)_ZN9QtPrivate27QDebugStreamOperatorForTypeIbLb1EE11debugStreamEPKNS_18QMetaTypeInterfaceER6QDebugPKv@Base 0.6.0 + _ZN9QtPrivate25QMetaTypeInterfaceWrapperIvE8metaTypeE@Base 0.10.0 _ZNKSt18bad_variant_access4whatEv@Base 0.6.0 (optional=templinst)_ZNSt10unique_ptrI6QTimerSt14default_deleteIS0_EED1Ev@Base 0.6.0 (optional=templinst)_ZNSt10unique_ptrI6QTimerSt14default_deleteIS0_EED2Ev@Base 0.6.0 @@ -123,9 +117,6 @@ libQCoro6WebSockets.so.0 libqcoro6websockets0 #MINVER# (optional=templinst)_ZZN9QtPrivate15ConnectionTypesINS_4ListIJSt8optionalISt5tupleIJ7QStringbEEEEEELb1EE5typesEvE1t@Base 0.6.0 (optional=templinst)_ZZN9QtPrivate15ConnectionTypesINS_4ListIJSt8optionalISt5tupleIJx10QByteArrayEEEEEELb1EE5typesEvE1t@Base 0.6.0 (optional=templinst)_ZZN9QtPrivate15ConnectionTypesINS_4ListIJbEEELb1EE5typesEvE1t@Base 0.6.0 - (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIP10QWebSocketE10getCopyCtrEvENUlPKNS_18QMetaTypeInterfaceEPvPKvE_4_FUNES6_S7_S9_@Base 0.6.0 - (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIP10QWebSocketE10getMoveCtrEvENUlPKNS_18QMetaTypeInterfaceEPvS7_E_4_FUNES6_S7_S7_@Base 0.6.0 - (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIP10QWebSocketE13getDefaultCtrEvENUlPKNS_18QMetaTypeInterfaceEPvE_4_FUNES6_S7_@Base 0.6.0 (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIP10QWebSocketE17getLegacyRegisterEvENUlvE_4_FUNEv@Base 0.6.0 (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeISt8optionalISt5tupleIJ10QByteArrayEEEE10getCopyCtrEvENUlPKNS_18QMetaTypeInterfaceEPvPKvE_4_FUNES9_SA_SC_@Base 0.6.0 (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeISt8optionalISt5tupleIJ10QByteArrayEEEE10getMoveCtrEvENUlPKNS_18QMetaTypeInterfaceEPvSA_E_4_FUNES9_SA_SA_@Base 0.6.0 @@ -152,6 +143,3 @@ libQCoro6WebSockets.so.0 libqcoro6websockets0 #MINVER# (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeISt8optionalISt5tupleIJx10QByteArrayEEEE13getDefaultCtrEvENUlPKNS_18QMetaTypeInterfaceEPvE_4_FUNES9_SA_@Base 0.6.0 (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeISt8optionalISt5tupleIJx10QByteArrayEEEE17getLegacyRegisterEvENUlvE_4_FUNEv@Base 0.6.0 (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeISt8optionalISt5tupleIJx10QByteArrayEEEE7getDtorEvENUlPKNS_18QMetaTypeInterfaceEPvE_4_FUNES9_SA_@Base 0.6.0 -#MISSING: 0.9.0# (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIbE10getCopyCtrEvENUlPKNS_18QMetaTypeInterfaceEPvPKvE_4_FUNES4_S5_S7_@Base 0.6.0 -#MISSING: 0.9.0# (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIbE10getMoveCtrEvENUlPKNS_18QMetaTypeInterfaceEPvS5_E_4_FUNES4_S5_S5_@Base 0.6.0 -#MISSING: 0.9.0# (optional=templinst)_ZZN9QtPrivate16QMetaTypeForTypeIbE13getDefaultCtrEvENUlPKNS_18QMetaTypeInterfaceEPvE_4_FUNES4_S5_@Base 0.6.0