Commit aee84333 authored by Andrii Grynenko's avatar Andrii Grynenko Committed by Facebook Github Bot 6

Use ReadMostlyMainPtrDeleter in folly::Singleton

Reviewed By: yfeldblum

Differential Revision: D3691541

fbshipit-source-id: 9488c1487ebd0500a23300292215456ca3220f03
parent c1dd3ab1
...@@ -140,10 +140,18 @@ bool SingletonHolder<T>::hasLiveInstance() { ...@@ -140,10 +140,18 @@ bool SingletonHolder<T>::hasLiveInstance() {
return !instance_weak_.expired(); return !instance_weak_.expired();
} }
template <typename T>
void SingletonHolder<T>::preDestroyInstance(
ReadMostlyMainPtrDeleter<>& deleter) {
instance_copy_ = instance_;
deleter.add(std::move(instance_));
}
template <typename T> template <typename T>
void SingletonHolder<T>::destroyInstance() { void SingletonHolder<T>::destroyInstance() {
state_ = SingletonHolderState::Dead; state_ = SingletonHolderState::Dead;
instance_.reset(); instance_.reset();
instance_copy_.reset();
if (destroy_baton_) { if (destroy_baton_) {
constexpr std::chrono::seconds kDestroyWaitTime{5}; constexpr std::chrono::seconds kDestroyWaitTime{5};
auto wait_result = destroy_baton_->timed_wait( auto wait_result = destroy_baton_->timed_wait(
......
...@@ -193,6 +193,14 @@ void SingletonVault::destroyInstances() { ...@@ -193,6 +193,14 @@ void SingletonVault::destroyInstances() {
CHECK_GE(singletons_.size(), creation_order_.size()); CHECK_GE(singletons_.size(), creation_order_.size());
// Release all ReadMostlyMainPtrs at once
{
ReadMostlyMainPtrDeleter<> deleter;
for (auto& singleton_type : creation_order_) {
singletons_[singleton_type]->preDestroyInstance(deleter);
}
}
for (auto type_iter = creation_order_.rbegin(); for (auto type_iter = creation_order_.rbegin();
type_iter != creation_order_.rend(); type_iter != creation_order_.rend();
++type_iter) { ++type_iter) {
......
...@@ -227,6 +227,7 @@ class SingletonHolderBase { ...@@ -227,6 +227,7 @@ class SingletonHolderBase {
virtual bool hasLiveInstance() = 0; virtual bool hasLiveInstance() = 0;
virtual void createInstance() = 0; virtual void createInstance() = 0;
virtual bool creationStarted() = 0; virtual bool creationStarted() = 0;
virtual void preDestroyInstance(ReadMostlyMainPtrDeleter<>&) = 0;
virtual void destroyInstance() = 0; virtual void destroyInstance() = 0;
private: private:
...@@ -255,6 +256,7 @@ struct SingletonHolder : public SingletonHolderBase { ...@@ -255,6 +256,7 @@ struct SingletonHolder : public SingletonHolderBase {
virtual bool hasLiveInstance() override; virtual bool hasLiveInstance() override;
virtual void createInstance() override; virtual void createInstance() override;
virtual bool creationStarted() override; virtual bool creationStarted() override;
virtual void preDestroyInstance(ReadMostlyMainPtrDeleter<>&) override;
virtual void destroyInstance() override; virtual void destroyInstance() override;
private: private:
...@@ -283,6 +285,8 @@ struct SingletonHolder : public SingletonHolderBase { ...@@ -283,6 +285,8 @@ struct SingletonHolder : public SingletonHolderBase {
// holds a ReadMostlyMainPtr to singleton instance, set when state is changed // holds a ReadMostlyMainPtr to singleton instance, set when state is changed
// from Dead to Living. Reset when state is changed from Living to Dead. // from Dead to Living. Reset when state is changed from Living to Dead.
folly::ReadMostlyMainPtr<T> instance_; folly::ReadMostlyMainPtr<T> instance_;
// used to release all ReadMostlyMainPtrs at once
folly::ReadMostlySharedPtr<T> instance_copy_;
// weak_ptr to the singleton instance, set when state is changed from Dead // weak_ptr to the singleton instance, set when state is changed from Dead
// to Living. We never write to this object after initialization, so it is // to Living. We never write to this object after initialization, so it is
// safe to read it from different threads w/o synchronization if we know // safe to read it from different threads w/o synchronization if we know
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment