From 80179e3b7e91bbe4d129b95eab8c6350e26f5569 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Wed, 19 Jun 2019 23:01:15 +0200 Subject: Port users of QDBusAbstractInterface::(async)callWithArgumentList() to new variadic (async)Call() Except in the auto-generated files. Required to add a cast operator from QDBusObjectPath to QVariant, as the variadic call() uses QVariant(arg) instead of QVariant::fromValue(arg). [ChangeLog][QtDBus][QDBusObjectPath] Added explicit cast operator to QVariant. Change-Id: I3f3004f7b9300a6340d27488f5b97981cbab3c24 Reviewed-by: Thiago Macieira --- src/plugins/bearer/connman/qconnmanservice_linux.cpp | 9 +++------ src/plugins/bearer/linux_common/qofonoservice_linux.cpp | 15 +++++---------- 2 files changed, 8 insertions(+), 16 deletions(-) (limited to 'src/plugins/bearer') diff --git a/src/plugins/bearer/connman/qconnmanservice_linux.cpp b/src/plugins/bearer/connman/qconnmanservice_linux.cpp index 3659eb7740..35d9c40680 100644 --- a/src/plugins/bearer/connman/qconnmanservice_linux.cpp +++ b/src/plugins/bearer/connman/qconnmanservice_linux.cpp @@ -80,8 +80,7 @@ QConnmanManagerInterface::QConnmanManagerInterface( QObject *parent) qDBusRegisterMetaType(); qDBusRegisterMetaType(); - QList argumentList; - QDBusPendingReply props_reply = asyncCallWithArgumentList(QLatin1String("GetProperties"), argumentList); + QDBusPendingReply props_reply = asyncCall(QLatin1String("GetProperties")); QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(props_reply, this); QObject::connect(watcher,SIGNAL(finished(QDBusPendingCallWatcher*)), @@ -106,8 +105,7 @@ QConnmanManagerInterface::QConnmanManagerInterface( QObject *parent) QLatin1String("TechnologyRemoved"), this,SLOT(technologyRemoved(QDBusObjectPath))); - QList argumentList2; - QDBusPendingReply serv_reply = asyncCallWithArgumentList(QLatin1String("GetServices"), argumentList2); + QDBusPendingReply serv_reply = asyncCall(QLatin1String("GetServices")); QDBusPendingCallWatcher *watcher2 = new QDBusPendingCallWatcher(serv_reply, this); QObject::connect(watcher2,SIGNAL(finished(QDBusPendingCallWatcher*)), @@ -289,8 +287,7 @@ QConnmanServiceInterface::QConnmanServiceInterface(const QString &dbusPathName,Q CONNMAN_SERVICE_INTERFACE, QDBusConnection::systemBus(), parent) { - QList argumentList; - QDBusPendingReply props_reply = asyncCallWithArgumentList(QLatin1String("GetProperties"), argumentList); + QDBusPendingReply props_reply = asyncCall(QLatin1String("GetProperties")); QDBusPendingCallWatcher *watcher = new QDBusPendingCallWatcher(props_reply, this); diff --git a/src/plugins/bearer/linux_common/qofonoservice_linux.cpp b/src/plugins/bearer/linux_common/qofonoservice_linux.cpp index 5d72731bc4..05f9b3ca17 100644 --- a/src/plugins/bearer/linux_common/qofonoservice_linux.cpp +++ b/src/plugins/bearer/linux_common/qofonoservice_linux.cpp @@ -99,8 +99,7 @@ QOfonoManagerInterface::~QOfonoManagerInterface() QStringList QOfonoManagerInterface::getModems() { if (modemList.isEmpty()) { - QList argumentList; - QDBusPendingReply reply = callWithArgumentList(QDBus::Block, QLatin1String("GetModems"), argumentList); + QDBusPendingReply reply = call(QDBus::Block, QLatin1String("GetModems")); reply.waitForFinished(); if (!reply.isError()) { const auto modems = reply.value(); @@ -184,8 +183,7 @@ QStringList QOfonoModemInterface::interfaces() QVariantMap QOfonoModemInterface::getProperties() { if (propertiesMap.isEmpty()) { - QList argumentList; - QDBusPendingReply reply = callWithArgumentList(QDBus::Block, QLatin1String("GetProperties"), argumentList); + QDBusPendingReply reply = call(QDBus::Block, QLatin1String("GetProperties")); if (!reply.isError()) { propertiesMap = reply.value(); } @@ -233,8 +231,7 @@ QVariant QOfonoNetworkRegistrationInterface::getProperty(const QString &property QVariantMap QOfonoNetworkRegistrationInterface::getProperties() { if (propertiesMap.isEmpty()) { - QList argumentList; - QDBusPendingReply reply = callWithArgumentList(QDBus::Block, QLatin1String("GetProperties"), argumentList); + QDBusPendingReply reply = call(QDBus::Block, QLatin1String("GetProperties")); reply.waitForFinished(); if (!reply.isError()) { propertiesMap = reply.value(); @@ -306,8 +303,7 @@ QVariant QOfonoDataConnectionManagerInterface::getProperty(const QString &proper QVariantMap &QOfonoDataConnectionManagerInterface::getProperties() { if (propertiesMap.isEmpty()) { - QList argumentList; - QDBusPendingReply reply = callWithArgumentList(QDBus::Block, QLatin1String("GetProperties"), argumentList); + QDBusPendingReply reply = call(QDBus::Block, QLatin1String("GetProperties")); if (!reply.isError()) { propertiesMap = reply.value(); } @@ -343,8 +339,7 @@ QOfonoConnectionContextInterface::~QOfonoConnectionContextInterface() QVariantMap QOfonoConnectionContextInterface::getProperties() { if (propertiesMap.isEmpty()) { - QList argumentList; - QDBusPendingReply reply = callWithArgumentList(QDBus::Block, QLatin1String("GetProperties"), argumentList); + QDBusPendingReply reply = call(QDBus::Block, QLatin1String("GetProperties")); if (!reply.isError()) { propertiesMap = reply.value(); } -- cgit v1.2.3 From 09b0038513bb738a89d9a0f1e64f7084f2dd5da0 Mon Sep 17 00:00:00 2001 From: Marc Mutz Date: Fri, 5 Jul 2019 12:39:57 +0200 Subject: Short live qt_unique_lock/qt_scoped_lock! (until C++17) Now that QRecursiveMutex is getting split off of QMutex, QMutexLocker will stop working on QRecursiveMutex once the split has been finalized in Qt 6. Even today, QMutexLocker contains casts from QBasicMutex to QMutex that some reviewers are uncomfortable with. One way to carry QMutexLocker forward is to template it on the mutex type, possibly with aliases like QBasicMutexLocker and QRecursiveMutexLocker. C++17 code would then not require a port, thanks to CTAD. But we have the problem now, and we can't template QMutexLocker in Qt 5. The alternative is to look at std and realize that they have surpassed QMutexLocker in expressiveness already. A scoped_lock cannot be unlocked again, a unique_lock can be moved around. QMutexLocker doesn't do either. The only "problem" is that the std lock classes are already templates, but we can't, yet, rely on C++17 CTAD to make them look as if they weren't. So, prepare for a future with C++17 CTAD by writing factory functions, qt_scoped_lock and qt_unique_lock, which will later port mechanically to their C++17 equivalents (mostly). The functions are added to a new private qlocking_p.h becauee we don't want to make them public. These are for use in Qt's own implementation, or for users that don't care about compatibility and will not mind them to be removed once we depend on C++17. Originally, I planned to use qmutex_p.h instead, but that header is not self-contained and causes build errors when we started to include it into libraries other than QtCore. Regarding the return value of qt_scoped_lock: Ideally, we'd like to return a std::scoped_lock, but two things stand in the way: First, scoped_lock was only added in C++17 (we fall back to lock_guard if scoped_lock is not available). Second, returning one from a function requires C++17 guaranteed copy elision, because neither scoped_lock not lock_guard have a copy ctor. In order for code not to come to depend on a particular lock class, we return any of lock_guard, unique_lock or scoped_guard, depending on what the compiler supports, and therefore wrap the functions in the unnamed namespace to avoid running into ODR if (private) headers are used from different projects (autotests, e.g.). By the time we can drop them, however, qt_*_lock will be semantically 100% identical to their replacements. Port some initial users. Change-Id: I2a208ef2a4a533ee8e675812273986460e6b4d00 Reviewed-by: Thiago Macieira --- src/plugins/bearer/connman/qconnmanengine.cpp | 45 +++++++++++++-------------- 1 file changed, 22 insertions(+), 23 deletions(-) (limited to 'src/plugins/bearer') diff --git a/src/plugins/bearer/connman/qconnmanengine.cpp b/src/plugins/bearer/connman/qconnmanengine.cpp index eabae5a07b..8b2076bd18 100644 --- a/src/plugins/bearer/connman/qconnmanengine.cpp +++ b/src/plugins/bearer/connman/qconnmanengine.cpp @@ -46,6 +46,7 @@ #include #include +#include #include #include @@ -74,13 +75,13 @@ QConnmanEngine::~QConnmanEngine() bool QConnmanEngine::connmanAvailable() const { - QMutexLocker locker(&mutex); + const auto locker = qt_scoped_lock(mutex); return connmanManager->isValid(); } void QConnmanEngine::initialize() { - QMutexLocker locker(&mutex); + const auto locker = qt_scoped_lock(mutex); connect(ofonoManager,SIGNAL(modemChanged()),this,SLOT(changedModem())); ofonoNetwork = new QOfonoNetworkRegistrationInterface(ofonoManager->currentModem(),this); @@ -101,7 +102,7 @@ void QConnmanEngine::initialize() void QConnmanEngine::changedModem() { - QMutexLocker locker(&mutex); + const auto locker = qt_scoped_lock(mutex); if (ofonoNetwork) delete ofonoNetwork; @@ -114,7 +115,7 @@ void QConnmanEngine::changedModem() void QConnmanEngine::servicesReady(const QStringList &list) { - QMutexLocker locker(&mutex); + const auto locker = qt_scoped_lock(mutex); for (const QString &servPath : list) addServiceConfiguration(servPath); @@ -123,7 +124,7 @@ void QConnmanEngine::servicesReady(const QStringList &list) QList QConnmanEngine::getConfigurations() { - QMutexLocker locker(&mutex); + const auto locker = qt_scoped_lock(mutex); QList fetchedConfigurations; QNetworkConfigurationPrivate* cpPriv = 0; const int numFoundConfigurations = foundConfigurations.count(); @@ -150,19 +151,19 @@ QList QConnmanEngine::getConfigurations() QString QConnmanEngine::getInterfaceFromId(const QString &id) { - QMutexLocker locker(&mutex); + const auto locker = qt_scoped_lock(mutex); return configInterfaces.value(id); } bool QConnmanEngine::hasIdentifier(const QString &id) { - QMutexLocker locker(&mutex); + const auto locker = qt_scoped_lock(mutex); return accessPointConfigurations.contains(id); } void QConnmanEngine::connectToId(const QString &id) { - QMutexLocker locker(&mutex); + const auto locker = qt_scoped_lock(mutex); QConnmanServiceInterface *serv = connmanServiceInterfaces.value(id); @@ -184,7 +185,7 @@ void QConnmanEngine::connectToId(const QString &id) void QConnmanEngine::disconnectFromId(const QString &id) { - QMutexLocker locker(&mutex); + const auto locker = qt_scoped_lock(mutex); QConnmanServiceInterface *serv = connmanServiceInterfaces.value(id); if (!serv || !serv->isValid()) { @@ -196,7 +197,7 @@ void QConnmanEngine::disconnectFromId(const QString &id) void QConnmanEngine::requestUpdate() { - QMutexLocker locker(&mutex); + const auto locker = qt_scoped_lock(mutex); QTimer::singleShot(0, this, SLOT(doRequestUpdate())); } @@ -215,7 +216,7 @@ void QConnmanEngine::finishedScan(bool error) void QConnmanEngine::updateServices(const ConnmanMapList &changed, const QList &removed) { - QMutexLocker locker(&mutex); + const auto locker = qt_scoped_lock(mutex); foreach (const QDBusObjectPath &objectPath, removed) { removeConfiguration(objectPath.path()); @@ -234,7 +235,7 @@ void QConnmanEngine::updateServices(const ConnmanMapList &changed, const QListgetServices(); for (const QString &servPath : servPaths) { if (connmanServiceInterfaces.contains(servPath)) { @@ -352,7 +353,7 @@ void QConnmanEngine::configurationChange(QConnmanServiceInterface *serv) { if (!serv) return; - QMutexLocker locker(&mutex); + auto locker = qt_unique_lock(mutex); QString id = serv->path(); if (accessPointConfigurations.contains(id)) { @@ -381,7 +382,7 @@ void QConnmanEngine::configurationChange(QConnmanServiceInterface *serv) if (changed) { locker.unlock(); emit configurationChanged(ptr); - locker.relock(); + locker.lock(); } } @@ -391,7 +392,7 @@ void QConnmanEngine::configurationChange(QConnmanServiceInterface *serv) QNetworkConfiguration::StateFlags QConnmanEngine::getStateForService(const QString &service) { - QMutexLocker locker(&mutex); + const auto locker = qt_scoped_lock(mutex); QConnmanServiceInterface *serv = connmanServiceInterfaces.value(service); if (!serv) return QNetworkConfiguration::Undefined; @@ -472,7 +473,7 @@ bool QConnmanEngine::isRoamingAllowed(const QString &context) void QConnmanEngine::removeConfiguration(const QString &id) { - QMutexLocker locker(&mutex); + auto locker = qt_unique_lock(mutex); if (accessPointConfigurations.contains(id)) { @@ -485,13 +486,12 @@ void QConnmanEngine::removeConfiguration(const QString &id) foundConfigurations.removeOne(ptr.data()); locker.unlock(); emit configurationRemoved(ptr); - locker.relock(); } } void QConnmanEngine::addServiceConfiguration(const QString &servicePath) { - QMutexLocker locker(&mutex); + auto locker = qt_unique_lock(mutex); if (!connmanServiceInterfaces.contains(servicePath)) { QConnmanServiceInterface *serv = new QConnmanServiceInterface(servicePath, this); connmanServiceInterfaces.insert(serv->path(),serv); @@ -547,7 +547,6 @@ void QConnmanEngine::addServiceConfiguration(const QString &servicePath) locker.unlock(); Q_EMIT configurationAdded(ptr); - locker.relock(); } } -- cgit v1.2.3 From 5bb178c479a247720fbc3fbb7f06a32b725193ac Mon Sep 17 00:00:00 2001 From: BogDan Vatra Date: Thu, 1 Aug 2019 08:56:59 +0300 Subject: Say hello to Android multi arch build in one go Multi arch build in one go is need to support the new .aab packaging format. By default the users apps are built for all Android ABIs: arm64-v8a armeabi-v7a x86_64 x86 The user can pass ANDROID_ABIS to qmake to filter the ABIs during development, e.g. qmake ANDROID_ABIS="arm64-v8a armeabi-v7a" will build only for arm ABIs. [ChangeLog][Android] Android multi arch build in one go, needed to support the new .aab packaging format. Change-Id: I3a64caf9621c2a195863976a62a57cdf47e6e3b5 Reviewed-by: Eskil Abrahamsen Blomfeldt --- src/plugins/bearer/android/jar/jar.pro | 2 ++ 1 file changed, 2 insertions(+) (limited to 'src/plugins/bearer') diff --git a/src/plugins/bearer/android/jar/jar.pro b/src/plugins/bearer/android/jar/jar.pro index f988019dac..8277a8abc1 100644 --- a/src/plugins/bearer/android/jar/jar.pro +++ b/src/plugins/bearer/android/jar/jar.pro @@ -1,3 +1,5 @@ +CONFIG += single_arch + TARGET = QtAndroidBearer load(qt_build_paths) -- cgit v1.2.3