From bff36f780001d8b26a1eefddd8ee48894061a220 Mon Sep 17 00:00:00 2001 From: Johannes Schanda Date: Wed, 10 Jul 2013 10:31:03 +0200 Subject: Check for illegal proxy builds in callbacks --- src/CommonAPI/DBus/DBusServiceRegistry.cpp | 17 ++++++++++++----- src/CommonAPI/DBus/DBusServiceRegistry.h | 1 + 2 files changed, 13 insertions(+), 5 deletions(-) diff --git a/src/CommonAPI/DBus/DBusServiceRegistry.cpp b/src/CommonAPI/DBus/DBusServiceRegistry.cpp index 0957485..13c28ab 100644 --- a/src/CommonAPI/DBus/DBusServiceRegistry.cpp +++ b/src/CommonAPI/DBus/DBusServiceRegistry.cpp @@ -15,7 +15,7 @@ namespace DBus { DBusServiceRegistry::DBusServiceRegistry(std::shared_ptr dbusProxyConnection): dbusDaemonProxy_(std::make_shared(dbusProxyConnection)), dbusNameListStatus_(AvailabilityStatus::UNKNOWN), - initialized_(false) { + initialized_(false), notificationThread_() { } DBusServiceRegistry::~DBusServiceRegistry() { @@ -271,8 +271,13 @@ DBusServiceRegistry::Subscription DBusServiceRegistry::subscribeAvailabilityList DBusAddressTranslator::getInstance().searchForDBusAddress(commonApiAddress, dbusInterfaceName, dbusServiceName, dbusObjectPath); + if (notificationThread_ == std::this_thread::get_id()) { + printf("You must not build proxies in callbacks of ProxyStatusEvent.\n" + "Refer to the documentation for suggestions how to avoid this.\n"); + assert(false); + } std::lock_guard dbusServicesLock(dbusServicesMutex_); - + notificationThread_ = std::this_thread::get_id(); DBusServiceList::iterator dbusServiceIterator = dbusServices_.find(dbusServiceName); // Service not known, so just add it to the list of unkown or definitely not available services @@ -331,7 +336,7 @@ DBusServiceRegistry::Subscription DBusServiceRegistry::subscribeAvailabilityList } break; } - + notificationThread_ = std::thread::id(); return listenerSubscription; } @@ -410,8 +415,9 @@ SubscriptionStatus DBusServiceRegistry::onDBusDaemonProxyNameOwnerChangedEvent(c } std::lock_guard dbusServicesLock(dbusServicesMutex_); - + notificationThread_ = std::this_thread::get_id(); onDBusServiceAvailabilityStatus(affectedName, dbusServiceAvailabilityStatus); + notificationThread_ = std::thread::id(); } return SubscriptionStatus::RETAIN; @@ -419,7 +425,7 @@ SubscriptionStatus DBusServiceRegistry::onDBusDaemonProxyNameOwnerChangedEvent(c void DBusServiceRegistry::onListNamesCallback(const CommonAPI::CallStatus& callStatus, std::vector dbusNames) { std::lock_guard dbusServicesLock(dbusServicesMutex_); - + notificationThread_ = std::this_thread::get_id(); if (callStatus == CallStatus::SUCCESS) { for (const std::string& dbusName : dbusNames) { if (isDBusServiceName(dbusName)) { @@ -440,6 +446,7 @@ void DBusServiceRegistry::onListNamesCallback(const CommonAPI::CallStatus& callS dbusServiceIterator++; } } + notificationThread_ = std::thread::id(); } diff --git a/src/CommonAPI/DBus/DBusServiceRegistry.h b/src/CommonAPI/DBus/DBusServiceRegistry.h index fa40b9e..d7426bf 100644 --- a/src/CommonAPI/DBus/DBusServiceRegistry.h +++ b/src/CommonAPI/DBus/DBusServiceRegistry.h @@ -130,6 +130,7 @@ class DBusServiceRegistry: public std::enable_shared_from_this