Blob Blame History Raw
diff --git a/sal/rtl/source/alloc_arena.c b/sal/rtl/source/alloc_arena.c
index 27ac970..c2294d8 100644
--- a/sal/rtl/source/alloc_arena.c
+++ b/sal/rtl/source/alloc_arena.c
@@ -102,13 +102,6 @@ rtl_machdep_pagesize (void);
 rtl_arena_type * gp_default_arena = 0;
 
 
-/** rtl_arena_init()
- *  @internal
- */
-static int
-rtl_arena_init (void);
-
-
 /* ================================================================= */
 
 /** rtl_arena_segment_constructor()
@@ -921,6 +914,8 @@ rtl_arena_deactivate (
  *
  * ================================================================= */
 
+extern void ensureArenaSingleton();
+
 /** rtl_arena_create()
  */
 rtl_arena_type *
@@ -973,7 +968,8 @@ try_alloc:
     }
     else if (gp_arena_arena == 0)
     {
-        if (rtl_arena_init())
+        ensureArenaSingleton();
+        if (gp_arena_arena)
         {
             /* try again */
             goto try_alloc;
@@ -1279,8 +1275,8 @@ rtl_machdep_pagesize (void)
  *
  * ================================================================= */
 
-static void
-rtl_arena_once_init (void)
+void
+rtl_arena_init (void)
 {
     {
         /* list of arenas */
@@ -1342,36 +1338,11 @@ rtl_arena_once_init (void)
         );
         OSL_ASSERT(gp_arena_arena != 0);
     }
-}
-
-static int
-rtl_arena_init (void)
-{
-    static sal_once_type g_once = SAL_ONCE_INIT;
-    SAL_ONCE(&g_once, rtl_arena_once_init);
-    return (gp_arena_arena != 0);
+    OSL_TRACE("rtl_arena_init completed");
 }
 
 /* ================================================================= */
 
-/*
-  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.
-
-  Delegated the call to "rtl_arena_fini()" into a dummy C++ object,
-  see alloc_fini.cxx .
-*/
-#if defined(__GNUC__) && !defined(MACOSX)
-static void rtl_arena_fini (void) __attribute__((destructor));
-#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
-#pragma fini(rtl_arena_fini)
-static void rtl_arena_fini (void);
-#endif /* __GNUC__ || __SUNPRO_C */
-
 void
 rtl_arena_fini (void)
 {
@@ -1394,6 +1365,7 @@ rtl_arena_fini (void)
         }
         RTL_MEMORY_LOCK_RELEASE(&(g_arena_list.m_lock));
     }
+    OSL_TRACE("rtl_arena_fini completed");
 }
 
 /* ================================================================= */
diff --git a/sal/rtl/source/alloc_cache.c b/sal/rtl/source/alloc_cache.c
index 06de201..ebf799e 100644
--- a/sal/rtl/source/alloc_cache.c
+++ b/sal/rtl/source/alloc_cache.c
@@ -99,13 +99,6 @@ static rtl_cache_type * gp_cache_slab_cache = 0;
 static rtl_cache_type * gp_cache_bufctl_cache = 0;
 
 
-/** rtl_cache_init()
- *  @internal
- */
-static int
-rtl_cache_init (void);
-
-
 /* ================================================================= */
 
 /** RTL_CACHE_HASH_INDEX()
@@ -1119,6 +1112,8 @@ rtl_cache_deactivate (
  *
  * ================================================================= */
 
+extern void ensureCacheSingleton();
+
 /** rtl_cache_create()
  */
 rtl_cache_type *
@@ -1176,7 +1171,8 @@ try_alloc:
     }
     else if (gp_cache_arena == 0)
     {
-        if (rtl_cache_init())
+        ensureCacheSingleton();
+        if (gp_cache_arena)
         {
             /* try again */
             goto try_alloc;
@@ -1583,8 +1579,8 @@ rtl_cache_wsupdate_all (void * arg)
  *
  * ================================================================= */
 
-static void
-rtl_cache_once_init (void)
+void
+rtl_cache_init (void)
 {
     {
         /* list of caches */
@@ -1680,36 +1676,11 @@ rtl_cache_once_init (void)
     }
 
     rtl_cache_wsupdate_init();
-}
-
-static int
-rtl_cache_init (void)
-{
-    static sal_once_type g_once = SAL_ONCE_INIT;
-    SAL_ONCE(&g_once, rtl_cache_once_init);
-    return (gp_cache_arena != 0);
+    OSL_TRACE("rtl_cache_init completed");
 }
 
 /* ================================================================= */
 
-/*
-  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.
-
-  Delegated the call to "rtl_cache_fini()" into a dummy C++ object,
-  see alloc_fini.cxx .
-*/
-#if defined(__GNUC__) && !defined(MACOSX)
-static void rtl_cache_fini (void) __attribute__((destructor));
-#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
-#pragma fini(rtl_cache_fini)
-static void rtl_cache_fini (void);
-#endif /* __GNUC__ || __SUNPRO_C */
-
 void
 rtl_cache_fini (void)
 {
@@ -1765,6 +1736,7 @@ rtl_cache_fini (void)
         }
         RTL_MEMORY_LOCK_RELEASE(&(g_cache_list.m_lock));
     }
+    OSL_TRACE("rtl_cache_fini completed");
 }
 
 /* ================================================================= */
diff --git a/sal/rtl/source/alloc_fini.cxx b/sal/rtl/source/alloc_fini.cxx
index 5bc174e..f079676 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: */
diff --git a/sal/rtl/source/alloc_global.c b/sal/rtl/source/alloc_global.c
index 70504ac..fb95e83 100644
--- a/sal/rtl/source/alloc_global.c
+++ b/sal/rtl/source/alloc_global.c
@@ -29,6 +29,7 @@
 #include "alloc_impl.h"
 #include "rtl/alloc.h"
 #include <sal/macros.h>
+#include <osl/diagnose.h>
 
 #include <string.h>
 #include <stdio.h>
@@ -66,7 +67,6 @@ static void determine_alloc_mode(void)
 
 #include "internal/once.h"
 #include "sal/macros.h"
-#include "osl/diagnose.h"
 
 /* ================================================================= *
  *
@@ -108,60 +108,7 @@ static rtl_cache_type * g_alloc_table[RTL_MEMORY_CACHED_LIMIT >> RTL_MEMALIGN_SH
 
 static rtl_arena_type * gp_alloc_arena = 0;
 
-/* ================================================================= *
- *
- * custom allocator initialization / finalization.
- *
- * ================================================================= */
-
-static void
-rtl_memory_once_init (void)
-{
-    {
-        /* global memory arena */
-        OSL_ASSERT(gp_alloc_arena == 0);
-
-        gp_alloc_arena = rtl_arena_create (
-            "rtl_alloc_arena",
-            2048,     /* quantum */
-            0,        /* w/o quantum caching */
-            0,        /* default source */
-            rtl_arena_alloc,
-            rtl_arena_free,
-            0         /* flags */
-        );
-        OSL_ASSERT(gp_alloc_arena != 0);
-    }
-    {
-        sal_Size size;
-        int i, n = RTL_MEMORY_CACHED_SIZES;
-
-        for (i = 0; i < n; i++)
-        {
-            char name[RTL_CACHE_NAME_LENGTH + 1];
-            (void) snprintf (name, sizeof(name), "rtl_alloc_%lu", g_alloc_sizes[i]);
-            g_alloc_caches[i] = rtl_cache_create (name, g_alloc_sizes[i], 0, NULL, NULL, NULL, NULL, NULL, 0);
-        }
-
-        size = RTL_MEMALIGN;
-        for (i = 0; i < n; i++)
-        {
-            while (size <= g_alloc_sizes[i])
-            {
-                g_alloc_table[(size - 1) >> RTL_MEMALIGN_SHIFT] = g_alloc_caches[i];
-                size += RTL_MEMALIGN;
-            }
-        }
-    }
-}
-
-static int
-rtl_memory_init (void)
-{
-    static sal_once_type g_once = SAL_ONCE_INIT;
-    SAL_ONCE(&g_once, rtl_memory_once_init);
-    return (gp_alloc_arena != 0);
-}
+extern void ensureMemorySingleton();
 
 /* ================================================================= *
  *
@@ -198,7 +145,8 @@ try_alloc:
         }
         else if (gp_alloc_arena == 0)
         {
-            if (rtl_memory_init())
+            ensureMemorySingleton();
+            if (gp_alloc_arena)
             {
                 /* try again */
                 goto try_alloc;
@@ -256,28 +204,58 @@ void * SAL_CALL rtl_reallocateMemory_CUSTOM (void * p, sal_Size n) SAL_THROW_EXT
 
 #endif
 
+/* ================================================================= *
+ *
+ * custom allocator initialization / finalization.
+ *
+ * ================================================================= */
+
+void rtl_memory_init (void)
+{
+#if !defined(FORCE_SYSALLOC)
+    {
+        /* global memory arena */
+        OSL_ASSERT(gp_alloc_arena == 0);
+
+        gp_alloc_arena = rtl_arena_create (
+            "rtl_alloc_arena",
+            2048,     /* quantum */
+            0,        /* w/o quantum caching */
+            0,        /* default source */
+            rtl_arena_alloc,
+            rtl_arena_free,
+            0         /* flags */
+        );
+        OSL_ASSERT(gp_alloc_arena != 0);
+    }
+    {
+        sal_Size size;
+        int i, n = RTL_MEMORY_CACHED_SIZES;
+
+        for (i = 0; i < n; i++)
+        {
+            char name[RTL_CACHE_NAME_LENGTH + 1];
+            (void) snprintf (name, sizeof(name), "rtl_alloc_%lu", g_alloc_sizes[i]);
+            g_alloc_caches[i] = rtl_cache_create (name, g_alloc_sizes[i], 0, NULL, NULL, NULL, NULL, NULL, 0);
+        }
+
+        size = RTL_MEMALIGN;
+        for (i = 0; i < n; i++)
+        {
+            while (size <= g_alloc_sizes[i])
+            {
+                g_alloc_table[(size - 1) >> RTL_MEMALIGN_SHIFT] = g_alloc_caches[i];
+                size += RTL_MEMALIGN;
+            }
+        }
+    }
+#endif
+    OSL_TRACE("rtl_memory_init completed");
+}
+
 /* ================================================================= */
 
-/*
-  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_fini") become called _before_ global
-  C++ object d'tors.
-
-  Delegated the call to "rtl_memory_fini" into a dummy C++ object,
-  see memory_fini.cxx .
-*/
-#if defined(__GNUC__) && !defined(MACOSX) && !defined(AIX)
-static void rtl_memory_fini (void) __attribute__((destructor));
-#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
-#pragma fini(rtl_memory_fini)
-static void rtl_memory_fini (void);
-#endif /* __GNUC__ || __SUNPRO_C */
-
-void
-rtl_memory_fini (void)
+void rtl_memory_fini (void)
 {
 #if !defined(FORCE_SYSALLOC)
     int i, n;
@@ -302,6 +280,7 @@ rtl_memory_fini (void)
         gp_alloc_arena = 0;
     }
 #endif
+    OSL_TRACE("rtl_memory_fini completed");
 }
 
 /* ================================================================= *
diff --git a/sal/rtl/source/makefile.mk b/sal/rtl/source/makefile.mk
index 67ae7f8..9c3921d 100644
--- a/sal/rtl/source/makefile.mk
+++ b/sal/rtl/source/makefile.mk
@@ -100,12 +100,8 @@ SLOFILES=   \
             $(SLO)$/math.obj        \
             $(SLO)$/alloc_global.obj\
             $(SLO)$/alloc_cache.obj \
-            $(SLO)$/alloc_arena.obj
-
-.IF "$(OS)"=="MACOSX" || "$(OS)"=="AIX"
-SLOFILES+=$(SLO)$/alloc_fini.obj
-.ENDIF
-
+            $(SLO)$/alloc_arena.obj \
+            $(SLO)$/alloc_fini.obj
 
 OBJFILES=   \
             $(OBJ)$/memory.obj      \
@@ -132,11 +128,8 @@ OBJFILES=   \
             $(OBJ)$/math.obj \
             $(OBJ)$/alloc_global.obj\
             $(OBJ)$/alloc_cache.obj \
-            $(OBJ)$/alloc_arena.obj
-
-.IF "$(OS)"=="MACOSX" || "$(OS)"=="AIX"
-OBJFILES+=$(OBJ)$/alloc_fini.obj
-.ENDIF
+            $(OBJ)$/alloc_arena.obj \
+            $(OBJ)$/alloc_fini.obj
 
 
 APP1TARGET=gen_makefile
diff --git a/sal/rtl/source/alloc_fini.cxx b/sal/rtl/source/alloc_fini.cxx
index f079676..dfd3599 100644
--- a/sal/rtl/source/alloc_fini.cxx
+++ b/sal/rtl/source/alloc_fini.cxx
@@ -43,7 +43,8 @@ namespace
             rtl_memory_fini();
         }
     };
-    class theMemorySingleton : public rtl::Static<rtlMemorySingleton, theMemorySingleton>{};
+    class theMemorySingleton
+        : public rtl::Static<rtlMemorySingleton, theMemorySingleton>{};
 }
 extern "C" void ensureMemorySingleton()
 {
@@ -65,7 +66,8 @@ namespace
             rtl_cache_fini();
         }
     };
-    class theCacheSingleton : public rtl::Static<rtlCacheSingleton, theCacheSingleton>{};
+    class theCacheSingleton
+        : public rtl::Static<rtlCacheSingleton, theCacheSingleton>{};
 }
 extern "C" void ensureCacheSingleton()
 {
@@ -87,11 +89,35 @@ namespace
             rtl_arena_fini();
         }
     };
-    class theArenaSingleton : public rtl::Static<rtlArenaSingleton, theArenaSingleton>{};
+    class theArenaSingleton
+        : public rtl::Static<rtlArenaSingleton, theArenaSingleton>{};
 }
 extern "C" void ensureArenaSingleton()
 {
     theArenaSingleton::get();
 }
 
+extern "C" void rtl_locale_fini (void);
+extern "C" void rtl_locale_init (void);
+namespace
+{
+    struct rtlLocaleSingleton
+    {
+        rtlLocaleSingleton()
+        {
+            rtl_locale_init();
+        }
+        ~rtlLocaleSingleton()
+        {
+            rtl_locale_fini();
+        }
+    };
+    class theLocaleSingleton
+        : public rtl::Static<rtlLocaleSingleton, theLocaleSingleton>{};
+}
+extern "C" void ensureLocaleSingleton()
+{
+    theLocaleSingleton::get();
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sal/rtl/source/locale.c b/sal/rtl/source/locale.c
index 964be09..79f2fb8 100644
--- a/sal/rtl/source/locale.c
+++ b/sal/rtl/source/locale.c
@@ -58,8 +58,6 @@ static RTL_HASHTABLE* g_pLocaleTable = NULL;
 
 static rtl_Locale* g_pDefaultLocale = NULL;
 
-static int rtl_locale_init (void);
-
 /*************************************************************************
  */
 void rtl_hashentry_destroy(RTL_HASHENTRY* entry)
@@ -228,29 +226,15 @@ sal_Bool rtl_hashtable_find(RTL_HASHTABLE * table, sal_Int32 key, sal_Int32 hash
 /*************************************************************************
  *  rtl_locale_init
  */
-static void rtl_locale_once_init (void)
+void rtl_locale_init (void)
 {
   OSL_ASSERT(g_pLocaleTable == 0);
   rtl_hashtable_init(&g_pLocaleTable, 1);
 }
 
-static int rtl_locale_init (void)
-{
-  static sal_once_type g_once = SAL_ONCE_INIT;
-  SAL_ONCE(&g_once, rtl_locale_once_init);
-  return (g_pLocaleTable != 0);
-}
-
 /*************************************************************************
  *  rtl_locale_fini
  */
-#if defined(__GNUC__)
-static void rtl_locale_fini (void) __attribute__((destructor));
-#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
-#pragma fini(rtl_locale_fini)
-static void rtl_locale_fini (void);
-#endif /* __GNUC__ || __SUNPRO_C */
-
 void rtl_locale_fini (void)
 {
   if (g_pLocaleTable != 0)
@@ -260,6 +244,8 @@ void rtl_locale_fini (void)
   }
 }
 
+extern void ensureLocaleSingleton();
+
 /*************************************************************************
  *  rtl_locale_register
  */
@@ -278,7 +264,8 @@ rtl_Locale * SAL_CALL rtl_locale_register( const sal_Unicode * language, const s
     if ( !variant )
         variant = &c;
 
-    if (!rtl_locale_init())
+    ensureLocaleSingleton();
+    if (!g_pLocaleTable)
       return NULL;
 
     hashCode = rtl_ustr_hashCode(language) ^ rtl_ustr_hashCode(country) ^ rtl_ustr_hashCode(variant);