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
auto wait_result = entry.destroy_baton->timed_wait(
std::chrono::steady_clock::now() + kDestroyWaitTime);
if (!wait_result) {
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 "
<< "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 "
#include <folly/Hash.h>
#include <folly/Memory.h>
#include <folly/RWSpinLock.h>
#include <folly/Hash.h>
#include <folly/Memory.h>
#include <folly/RWSpinLock.h>
+#include <folly/Demangle.h>
#include <folly/io/async/Request.h>
#include <algorithm>
#include <folly/io/async/Request.h>
#include <algorithm>
- 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 += "/";
if (tag_ti_ != std::type_index(typeid(DefaultTag))) {
ret += "/";
+ ret += demangle(tag_ti_.name());
+ return ret.toStdString();
}
friend class TypeDescriptorHasher;
}
friend class TypeDescriptorHasher;
auto it = singletons_.find(type);
if (it == singletons_.end()) {
throw std::out_of_range(std::string("non-existent singleton: ") +
auto it = singletons_.find(type);
if (it == singletons_.end()) {
throw std::out_of_range(std::string("non-existent singleton: ") +
}
return it->second.get();
}
return it->second.get();
// 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: ") +
// 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: ") +
}
std::lock_guard<std::mutex> entry_lock(entry->mutex);
}
std::lock_guard<std::mutex> entry_lock(entry->mutex);