From b610ff10870e2be7e1b9d034c15c9190ebd7051f Mon Sep 17 00:00:00 2001 From: Klaus Basan Date: Mon, 20 Aug 2018 18:15:31 +0200 Subject: [PATCH] Ref T301, core ping fix https://swift-project.slack.com/archives/G7GD2UP9C/p1534677752000100 Identifier list was filled and more and more identifiers got checked via DBus - identifier set if only one unique identifer is needed - using set avoids duplicates and fixes the bug - restart time if registered, no need to check again --- .../context/contextapplicationproxy.cpp | 3 +- .../context/contextapplicationproxy.h | 4 +- src/blackmisc/identifierlist.h | 2 +- src/blackmisc/identifierset.cpp | 50 ++++++++++++++++++ src/blackmisc/identifierset.h | 52 +++++++++++++++++++ 5 files changed, 107 insertions(+), 4 deletions(-) create mode 100644 src/blackmisc/identifierset.cpp create mode 100644 src/blackmisc/identifierset.h diff --git a/src/blackcore/context/contextapplicationproxy.cpp b/src/blackcore/context/contextapplicationproxy.cpp index eecd9f646..bdc861846 100644 --- a/src/blackcore/context/contextapplicationproxy.cpp +++ b/src/blackcore/context/contextapplicationproxy.cpp @@ -163,6 +163,7 @@ namespace BlackCore CIdentifier CContextApplicationProxy::registerApplication(const CIdentifier &application) { m_proxyPingIdentifiers.insert(application); + if (m_pingTimer.isActive()) { m_pingTimer.start(); } // restart, no need to ping again return m_dBusInterface->callDBusRet(QLatin1String("registerApplication"), application); } @@ -210,7 +211,7 @@ namespace BlackCore { if (!m_dBusInterface) { return; } if (m_proxyPingIdentifiers.isEmpty()) { return; } - const CIdentifierList identifiers = m_proxyPingIdentifiers; // copy so member can be modified + const CIdentifierSet identifiers = m_proxyPingIdentifiers; // copy so member can be modified for (const CIdentifier &identifier : identifiers) { this->registerApplication(identifier); diff --git a/src/blackcore/context/contextapplicationproxy.h b/src/blackcore/context/contextapplicationproxy.h index 2f478683f..caa1d6dcc 100644 --- a/src/blackcore/context/contextapplicationproxy.h +++ b/src/blackcore/context/contextapplicationproxy.h @@ -15,7 +15,7 @@ #include "blackcore/blackcoreexport.h" #include "blackcore/context/contextapplication.h" #include "blackcore/corefacadeconfig.h" -#include "blackmisc/identifierlist.h" +#include "blackmisc/identifierset.h" #include "blackmisc/statusmessage.h" #include "blackmisc/valuecache.h" @@ -90,7 +90,7 @@ namespace BlackCore private: BlackMisc::CGenericDBusInterface *m_dBusInterface = nullptr; //!< interface - BlackMisc::CIdentifierList m_proxyPingIdentifiers; //!< automatically ping the implementing side + BlackMisc::CIdentifierSet m_proxyPingIdentifiers; //!< automatically ping the implementing side QTimer m_pingTimer; //! Relay connection signals to local signals diff --git a/src/blackmisc/identifierlist.h b/src/blackmisc/identifierlist.h index 68722b4db..c12a6a001 100644 --- a/src/blackmisc/identifierlist.h +++ b/src/blackmisc/identifierlist.h @@ -54,7 +54,7 @@ namespace BlackMisc } //namespace Q_DECLARE_METATYPE(BlackMisc::CIdentifierList) -Q_DECLARE_METATYPE(BlackMisc::CCollection) Q_DECLARE_METATYPE(BlackMisc::CSequence) +// in set: Q_DECLARE_METATYPE(BlackMisc::CCollection) #endif //guard diff --git a/src/blackmisc/identifierset.cpp b/src/blackmisc/identifierset.cpp new file mode 100644 index 000000000..8b508a45d --- /dev/null +++ b/src/blackmisc/identifierset.cpp @@ -0,0 +1,50 @@ +/* Copyright (C) 2018 + * swift project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +#include "blackmisc/identifierset.h" + +#include +#include + +namespace BlackMisc +{ + CIdentifierSet::CIdentifierSet() { } + + CIdentifierSet::CIdentifierSet(const CCollection &other) : CCollection(other) + { + // void + } + + bool CIdentifierSet::containsAnyNotIn(const CIdentifierSet &other) const + { + return containsBy([&other](const CIdentifier & id) { return ! other.contains(id); }); + } + + CIdentifierSet CIdentifierSet::getMachinesUnique() const + { + CIdentifierSet il; + for (const CIdentifier &identifier : *this) + { + const bool contained = il.containsBy([ = ](const CIdentifier & ident) + { + return identifier.hasSameMachineName(ident); + }); + if (!contained) { il.push_back(identifier); } + } + return il; + } + + QStringList CIdentifierSet::getMachineNames(bool unique, bool sort) const + { + QStringList codes = this->transform(Predicates::MemberTransform(&CIdentifier::getMachineName)); + if (sort) { codes.sort(); } + if (unique) { codes.removeDuplicates(); } + return codes; + } +} // namespace diff --git a/src/blackmisc/identifierset.h b/src/blackmisc/identifierset.h new file mode 100644 index 000000000..9e23301b6 --- /dev/null +++ b/src/blackmisc/identifierset.h @@ -0,0 +1,52 @@ +/* Copyright (C) 2018 + * swift project Community / Contributors + * + * This file is part of swift project. It is subject to the license terms in the LICENSE file found in the top-level + * directory of this distribution and at http://www.swift-project.org/license.html. No part of swift project, + * including this file, may be copied, modified, propagated, or distributed except according to the terms + * contained in the LICENSE file. + */ + +//! \file + +#ifndef BLACKMISC_IDENTIFIERSET_H +#define BLACKMISC_IDENTIFIERSET_H + +#include "blackmisc/identifier.h" +#include "blackmisc/collection.h" +#include "blackmisc/variant.h" +#include "blackmisc/blackmiscexport.h" +#include + +namespace BlackMisc +{ + /*! + * Value object encapsulating a set of object identifiers + */ + class BLACKMISC_EXPORT CIdentifierSet : public CCollection + { + public: + //! Default constructor. + CIdentifierSet(); + + //! Construct from a base class object. + CIdentifierSet(const CCollection &other); + + //! This list contains an identifier which is not contained in other. + bool containsAnyNotIn(const CIdentifierSet &other) const; + + //! Get a list of identifiers reduced to maximum one per machine. + //! If there is more than one per machine, it is undefined which one will be added. + CIdentifierSet getMachinesUnique() const; + + //! Get machine names + QStringList getMachineNames(bool unique = true, bool sort = true) const; + }; +} //namespace + +Q_DECLARE_METATYPE(BlackMisc::CIdentifierSet) +Q_DECLARE_METATYPE(BlackMisc::CCollection) +// in list: Q_DECLARE_METATYPE(BlackMisc::CSequence) + + +#endif //guard