diff options
Diffstat (limited to 'src/CommonAPI/DBus/DBusProxy.cpp')
-rw-r--r-- | src/CommonAPI/DBus/DBusProxy.cpp | 18 |
1 files changed, 15 insertions, 3 deletions
diff --git a/src/CommonAPI/DBus/DBusProxy.cpp b/src/CommonAPI/DBus/DBusProxy.cpp index ef6388b..eef22b4 100644 --- a/src/CommonAPI/DBus/DBusProxy.cpp +++ b/src/CommonAPI/DBus/DBusProxy.cpp @@ -15,6 +15,8 @@ namespace CommonAPI { namespace DBus { +static std::weak_ptr<Factory> factory__(Factory::get()); + DBusProxyStatusEvent::DBusProxyStatusEvent(DBusProxy *_dbusProxy) : dbusProxy_(_dbusProxy) { } @@ -184,7 +186,8 @@ DBusProxy::DBusProxy(const DBusAddress &_dbusAddress, dbusProxyStatusEvent_(this), availabilityStatus_(AvailabilityStatus::UNKNOWN), interfaceVersionAttribute_(*this, "uu", "getInterfaceVersion"), - dbusServiceRegistry_(DBusServiceRegistry::get(_connection)) + dbusServiceRegistry_(DBusServiceRegistry::get(_connection)), + everAvailable_(false) { } @@ -204,7 +207,9 @@ DBusProxy::~DBusProxy() { dbusServiceRegistry_->unsubscribeAvailabilityListener( getAddress().getAddress(), dbusServiceRegistrySubscription_); - Factory::get()->decrementConnection(connection_); + if (auto ptr = factory__.lock()) { + ptr->decrementConnection(connection_); + } } bool DBusProxy::isAvailable() const { @@ -344,7 +349,12 @@ void DBusProxy::onDBusServiceInstanceStatus(std::shared_ptr<DBusProxy> _proxy, dbusProxyStatusEvent_.notifySpecificListener(listenerIt.first, availabilityStatus_); } + bool handleSignalState(false); if (availabilityStatus == AvailabilityStatus::AVAILABLE) { + if (everAvailable_) { + handleSignalState = true; + } + everAvailable_ = true; std::lock_guard < std::mutex > queueLock(signalMemberHandlerQueueMutex_); for(auto signalMemberHandlerIterator = signalMemberHandlerQueue_.begin(); @@ -387,6 +397,9 @@ void DBusProxy::onDBusServiceInstanceStatus(std::shared_ptr<DBusProxy> _proxy, std::get<2>(selectiveBroadcasts.second)); } } + if (handleSignalState) { + connection_->proxyPushFunctionToMainLoop<DBusConnection>(std::bind(&DBusProxyConnection::handleSignalStates, connection_)); + } } else { std::lock_guard < std::mutex > queueLock(signalMemberHandlerQueueMutex_); @@ -635,6 +648,5 @@ void DBusProxy::freeDesktopGetCurrentValueForSignalListener( availabilityMutex_.unlock(); } } - } // namespace DBus } // namespace CommonAPI |