print better error message
authorTianjiao Yin <ytj@fb.com>
Tue, 3 Feb 2015 22:03:18 +0000 (14:03 -0800)
committerAndrew Cox <andrewcox@fb.com>
Wed, 4 Feb 2015 21:03:16 +0000 (13:03 -0800)
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
folly/experimental/Singleton.h

index f60fb78cd37945e523101cc1f055a85aa95422a1..2684794eeb26eb475859122be57d12842990423b 100644 (file)
@@ -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 "
index 7c9d6e0704bcb7128577f6a8b68887d69a97c5aa..a715a278895fe2c1d4fe5dd435f4a954727f0128 100644 (file)
@@ -97,6 +97,7 @@
 #include <folly/Hash.h>
 #include <folly/Memory.h>
 #include <folly/RWSpinLock.h>
+#include <folly/Demangle.h>
 #include <folly/io/async/Request.h>
 
 #include <algorithm>
@@ -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<std::mutex> entry_lock(entry->mutex);