/*
- * Copyright 2015 Facebook, Inc.
+ * Copyright 2016 Facebook, Inc.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
#include <folly/Singleton.h>
#include <atomic>
+#include <cstdio>
+#include <cstdlib>
+#include <sstream>
#include <string>
+#include <folly/FileUtil.h>
#include <folly/ScopeGuard.h>
namespace folly {
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 {
}
void SingletonVault::registrationComplete() {
- RequestContext::saveContext();
std::atexit([](){ SingletonVault::singleton()->destroyInstances(); });
RWSpinLock::WriteHolder wh(&stateMutex_);
}
void SingletonVault::scheduleDestroyInstances() {
- RequestContext::saveContext();
+ // Add a dependency on folly::ThreadLocal to make sure all its static
+ // singletons are initalized first.
+ threadlocal_detail::StaticMeta<void>::instance();
class SingletonVaultDestructor {
public: