summaryrefslogtreecommitdiff
path: root/sal/rtl/source/alloc_fini.cxx
diff options
context:
space:
mode:
Diffstat (limited to 'sal/rtl/source/alloc_fini.cxx')
-rw-r--r--sal/rtl/source/alloc_fini.cxx81
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: */