Add conv_benchmark target to Makefile.am
[folly.git] / folly / Singleton.cpp
index 8e9cd99b0763138bd8eb7c61819da5c293a61703..df3cbcb059cdd647061402474bf18e3b81d90651 100644 (file)
 #include <folly/Singleton.h>
 
 #include <atomic>
+#include <cstdio>
+#include <cstdlib>
+#include <sstream>
 #include <string>
 
+#include <folly/FileUtil.h>
 #include <folly/ScopeGuard.h>
 
 namespace folly {
 
 namespace detail {
 
-constexpr std::chrono::seconds SingletonHolderBase::kDestroyWaitTime;
-
+[[noreturn]] void singletonWarnDoubleRegistrationAndAbort(
+    const TypeDescriptor& type) {
+  // Not using LOG(FATAL) or std::cerr because they may not be initialized yet.
+  std::ostringstream o;
+  o << "Double registration of singletons of the same "
+    << "underlying type; check for multiple definitions "
+    << "of type folly::Singleton<" << type.name() << ">" << std::endl;
+  auto s = o.str();
+  writeFull(STDERR_FILENO, s.data(), s.size());
+  std::abort();
+}
 }
 
 namespace {
@@ -65,8 +78,7 @@ void SingletonVault::registerSingleton(detail::SingletonHolderBase* entry) {
   stateCheck(SingletonVaultState::Running);
 
   if (UNLIKELY(registrationComplete_)) {
-    throw std::logic_error(
-      "Registering singleton after registrationComplete().");
+    LOG(ERROR) << "Registering singleton after registrationComplete().";
   }
 
   RWSpinLock::ReadHolder rhMutex(&mutex_);
@@ -83,8 +95,7 @@ void SingletonVault::addEagerInitSingleton(detail::SingletonHolderBase* entry) {
   stateCheck(SingletonVaultState::Running);
 
   if (UNLIKELY(registrationComplete_)) {
-    throw std::logic_error(
-        "Registering for eager-load after registrationComplete().");
+    LOG(ERROR) << "Registering for eager-load after registrationComplete().";
   }
 
   RWSpinLock::ReadHolder rhMutex(&mutex_);