leaky_singleton-inl.h 1.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. #ifndef LEAKY_SINGLETON_INL_H_
  2. #error "Direct inclusion of this file is not allowed, include leaky_singleton.h"
  3. // For the sake of sane code completion.
  4. #include "leaky_singleton.h"
  5. #endif
  6. #ifdef _asan_enabled_
  7. #include <sanitizer/lsan_interface.h>
  8. #endif
  9. #include <utility>
  10. namespace NYT {
  11. ////////////////////////////////////////////////////////////////////////////////
  12. template <class T>
  13. template <class... TArgs>
  14. TLeakyStorage<T>::TLeakyStorage(TArgs&&... args)
  15. {
  16. #ifdef _asan_enabled_
  17. __lsan_disable();
  18. #endif
  19. new (Get()) T(std::forward<TArgs>(args)...);
  20. #ifdef _asan_enabled_
  21. __lsan_enable();
  22. #endif
  23. }
  24. template <class T>
  25. T* TLeakyStorage<T>::Get()
  26. {
  27. return reinterpret_cast<T*>(Buffer_);
  28. }
  29. ////////////////////////////////////////////////////////////////////////////////
  30. template <class T, class... TArgs>
  31. T* LeakySingleton(TArgs&&... args)
  32. {
  33. static TLeakyStorage<T> Storage(std::forward<TArgs>(args)...);
  34. return Storage.Get();
  35. }
  36. ////////////////////////////////////////////////////////////////////////////////
  37. } // namespace NYT