From 10627e033330685c458c4b919f795d41d3fdd95c Mon Sep 17 00:00:00 2001 From: Yedidya Feldblum Date: Fri, 8 Jan 2016 18:40:42 -0800 Subject: [PATCH] SingeltonVault::ScopedExpunger - RAII class to clear singletons Summary: [Folly] `SingeltonVault::ScopedExpunger` - RAII class to clear singletons. Clears all singletons in the given vault at ctor and dtor times. Useful for unit-tests that need to clear the world. This need can arise when a unit-test needs to swap out an object used by a singleton for a test-double, but the singleton needing its dependency to be swapped has a type or a tag local to some other translation unit and unavailable in the current translation unit. Other, better approaches to this need are "plz 2 refactor" .... Reviewed By: andriigrynenko Differential Revision: D2802459 fb-gh-sync-id: c24cebd3a464ed5da29ea1d9e7b86c51d61cf631 --- folly/Singleton.h | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/folly/Singleton.h b/folly/Singleton.h index a4fdf203..20a043d7 100644 --- a/folly/Singleton.h +++ b/folly/Singleton.h @@ -312,6 +312,27 @@ class SingletonVault { Relaxed, // Singletons can be created before registrationComplete() }; + /** + * Clears all singletons in the given vault at ctor and dtor times. + * Useful for unit-tests that need to clear the world. + * + * This need can arise when a unit-test needs to swap out an object used by a + * singleton for a test-double, but the singleton needing its dependency to be + * swapped has a type or a tag local to some other translation unit and + * unavailable in the current translation unit. + * + * Other, better approaches to this need are "plz 2 refactor" .... + */ + struct ScopedExpunger { + SingletonVault* vault; + explicit ScopedExpunger(SingletonVault* v) : vault(v) { expunge(); } + ~ScopedExpunger() { expunge(); } + void expunge() { + vault->destroyInstances(); + vault->reenableInstances(); + } + }; + explicit SingletonVault(Type type = Type::Relaxed) : type_(type) {} // Destructor is only called by unit tests to check destroyInstances. -- 2.34.1