From d8386e3435de6422c2bac847410dcadb98288c6c Mon Sep 17 00:00:00 2001 From: Tianjiao Yin Date: Tue, 3 Feb 2015 14:03:18 -0800 Subject: [PATCH] print better error message Summary: before: E0203 12:32:34.548096 3354863 [admonitor-local] Singleton.cpp:72] Singleton of type N8facebook12configerator22ConfigeratorStaticDataE has a living reference at destroyInstances time; beware! Raw pointer is 0x7fd6ccc81000. It is very likely that some other singleton is holding a shared_ptr to it. Make dependencies between these singletons are properly defined. after: E0203 13:48:09.013022 3913115 Singleton.cpp:72] Singleton of type facebook::configerator::ConfigeratorStaticData has a living reference at destroyInstances time; beware! Raw pointer is 0x7f6f7dc4c000. It is very likely that some other singleton is holding a shared_ptr to it. Make dependencies between these singletons are properly defined. Test Plan: run it Reviewed By: chip@fb.com Subscribers: folly-diffs@, yfeldblum FB internal diff: D1822466 Signature: t1:1822466:1423000686:345f40fa706701476256a7157468521bc69166a0 --- folly/experimental/Singleton.cpp | 2 +- folly/experimental/Singleton.h | 13 +++++++------ 2 files changed, 8 insertions(+), 7 deletions(-) diff --git a/folly/experimental/Singleton.cpp b/folly/experimental/Singleton.cpp index f60fb78c..2684794e 100644 --- a/folly/experimental/Singleton.cpp +++ b/folly/experimental/Singleton.cpp @@ -69,7 +69,7 @@ void SingletonVault::destroyInstance(SingletonMap::iterator entry_it) { auto wait_result = entry.destroy_baton->timed_wait( std::chrono::steady_clock::now() + kDestroyWaitTime); if (!wait_result) { - LOG(ERROR) << "Singleton of type " << type.name() << " has a living " + LOG(ERROR) << "Singleton of type " << type.prettyName() << " has a living " << "reference at destroyInstances time; beware! Raw pointer " << "is " << entry.instance_ptr << ". It is very likely that " << "some other singleton is holding a shared_ptr to it. Make " diff --git a/folly/experimental/Singleton.h b/folly/experimental/Singleton.h index 7c9d6e07..a715a278 100644 --- a/folly/experimental/Singleton.h +++ b/folly/experimental/Singleton.h @@ -97,6 +97,7 @@ #include #include #include +#include #include #include @@ -162,13 +163,13 @@ class TypeDescriptor { return *this; } - std::string name() const { - std::string ret = ti_.name(); + std::string prettyName() const { + auto ret = demangle(ti_.name()); if (tag_ti_ != std::type_index(typeid(DefaultTag))) { ret += "/"; - ret += tag_ti_.name(); + ret += demangle(tag_ti_.name()); } - return ret; + return ret.toStdString(); } friend class TypeDescriptorHasher; @@ -436,7 +437,7 @@ class SingletonVault { auto it = singletons_.find(type); if (it == singletons_.end()) { throw std::out_of_range(std::string("non-existent singleton: ") + - type.name()); + type.prettyName()); } return it->second.get(); @@ -457,7 +458,7 @@ class SingletonVault { // it if it was set by current thread anyways. if (entry->creating_thread == std::this_thread::get_id()) { throw std::out_of_range(std::string("circular singleton dependency: ") + - type.name()); + type.prettyName()); } std::lock_guard entry_lock(entry->mutex); -- 2.34.1