diff options
Diffstat (limited to 'sal/rtl/source/alloc_fini.cxx')
-rw-r--r-- | sal/rtl/source/alloc_fini.cxx | 81 |
1 files changed, 60 insertions, 21 deletions
diff --git a/sal/rtl/source/alloc_fini.cxx b/sal/rtl/source/alloc_fini.cxx index aba5093a362d..89b2930250a4 100644 --- a/sal/rtl/source/alloc_fini.cxx +++ b/sal/rtl/source/alloc_fini.cxx @@ -26,33 +26,72 @@ * ************************************************************************/ -/* - Issue http://udk.openoffice.org/issues/show_bug.cgi?id=92388 - - Mac OS X does not seem to support "__cxa__atexit", thus leading - to the situation that "__attribute__((destructor))__" functions - (in particular "rtl_{memory|cache|arena}_fini") become called - _before_ global C++ object d'tors. - - Using a C++ dummy object instead. -*/ +#include <rtl/instance.hxx> extern "C" void rtl_memory_fini (void); -extern "C" void rtl_cache_fini (void); -extern "C" void rtl_arena_fini (void); - -struct RTL_Alloc_Fini +extern "C" void rtl_memory_init (void); +namespace +{ + struct rtlMemorySingleton + { + rtlMemorySingleton() + { + rtl_memory_init(); + } + ~rtlMemorySingleton() + { + rtl_memory_fini(); + } + }; + class theMemorySingleton : public rtl::Static<rtlMemorySingleton, theMemorySingleton>{}; +} +extern "C" void ensureMemorySingleton() { - ~RTL_Alloc_Fini() ; -}; + theMemorySingleton::get(); +} -RTL_Alloc_Fini::~RTL_Alloc_Fini() +extern "C" void rtl_cache_fini (void); +extern "C" void rtl_cache_init (void); +namespace +{ + struct rtlCacheSingleton + { + rtlCacheSingleton() + { + rtl_cache_init(); + } + ~rtlCacheSingleton() + { + rtl_cache_fini(); + } + }; + class theCacheSingleton : public rtl::Static<rtlCacheSingleton, theCacheSingleton>{}; +} +extern "C" void ensureCacheSingleton() { - rtl_memory_fini(); - rtl_cache_fini(); - rtl_arena_fini(); + theCacheSingleton::get(); } -static RTL_Alloc_Fini g_RTL_Alloc_Fini; +extern "C" void rtl_arena_fini (void); +extern "C" void rtl_arena_init (void); +namespace +{ + struct rtlArenaSingleton + { + rtlArenaSingleton() + { + rtl_arena_init(); + } + ~rtlArenaSingleton() + { + rtl_arena_fini(); + } + }; + class theArenaSingleton : public rtl::Static<rtlArenaSingleton, theArenaSingleton>{}; +} +extern "C" void ensureArenaSingleton() +{ + theArenaSingleton::get(); +} /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ |