You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
libreoffice/0001-helgrind-Related-rhbz-...

495 lines
12 KiB

From 47ea5b58c92777d8d35376b64a1c075fecb8b104 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
Date: Tue, 5 Apr 2011 11:19:35 +0100
Subject: [PATCH] helgrind: Related: rhbz#655686 get order of shutdown correct
---
sal/rtl/source/alloc_arena.c | 44 +++-----------
sal/rtl/source/alloc_cache.c | 44 +++-----------
sal/rtl/source/memory_fini.cxx | 81 +++++++++++++++++++-------
sal/rtl/source/alloc_global.c | 131 +++++++++++++++++------------------------
sal/rtl/source/makefile.mk | 15 +----
5 files changed, 135 insertions(+), 180 deletions(-)
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
@@ -111,13 +111,6 @@
rtl_arena_type * gp_default_arena = 0;
-/** rtl_arena_init()
- * @internal
- */
-static int
-rtl_arena_init (void);
-
-
/* ================================================================= */
/** rtl_arena_segment_constructor()
@@ -930,6 +923,8 @@
*
* ================================================================= */
+extern void ensureArenaSingleton();
+
/** rtl_arena_create()
*/
rtl_arena_type *
@@ -980,7 +975,8 @@
}
else if (gp_arena_arena == 0)
{
- if (rtl_arena_init())
+ ensureArenaSingleton();
+ if (gp_arena_arena)
{
/* try again */
goto try_alloc;
@@ -1276,8 +1272,8 @@
*
* ================================================================= */
-static void
-rtl_arena_once_init (void)
+void
+rtl_arena_init (void)
{
{
/* list of arenas */
@@ -1336,25 +1332,11 @@
);
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");
}
/* ================================================================= */
-#if defined(__GNUC__)
-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)
{
@@ -1377,6 +1359,7 @@
}
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_bufctl_cache = 0;
-/** rtl_cache_init()
- * @internal
- */
-static int
-rtl_cache_init (void);
-
-
/* ================================================================= */
/** RTL_CACHE_HASH_INDEX()
@@ -1099,6 +1092,8 @@
*
* ================================================================= */
+extern void ensureCacheSingleton();
+
/** rtl_cache_create()
*/
rtl_cache_type *
@@ -1154,7 +1149,8 @@
}
else if (gp_cache_arena == 0)
{
- if (rtl_cache_init())
+ ensureCacheSingleton();
+ if (gp_cache_arena)
{
/* try again */
goto try_alloc;
@@ -1552,8 +1548,8 @@
*
* ================================================================= */
-static void
-rtl_cache_once_init (void)
+void
+rtl_cache_init (void)
{
{
/* list of caches */
@@ -1646,25 +1642,10 @@
}
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");
}
-/* ================================================================= */
-
-#if defined(__GNUC__)
-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)
{
@@ -1717,6 +1698,7 @@
}
RTL_MEMORY_LOCK_RELEASE(&(g_cache_list.m_lock));
}
+ OSL_TRACE("rtl_cache_fini completed");
}
/* ================================================================= */
diff --git a/sal/rtl/source/memory_fini.cxx b/sal/rtl/source/memory_fini.cxx
index 5bc174e..f079676 100644
--- a/sal/rtl/source/memory_fini.cxx
+++ b/sal/rtl/source/memory_fini.cxx
@@ -26,32 +26,98 @@
*
************************************************************************/
-
-/*
- 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.
-
- Using a C++ dummy object instead.
-*/
-
-#include <stdio.h>
+#include <rtl/instance.hxx>
extern "C" void rtl_memory_fini (void);
+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()
+{
+ theMemorySingleton::get();
+}
-
-struct RTL_Memory_Fini {
- ~RTL_Memory_Fini() ;
-};
-
-RTL_Memory_Fini::~RTL_Memory_Fini() {
- rtl_memory_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()
+{
+ theCacheSingleton::get();
}
+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();
+}
-static RTL_Memory_Fini rtl_Memory_Fini;
+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/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
@@ -28,6 +28,7 @@
#include "rtl/alloc.h"
#include <sal/macros.h>
+#include <osl/diagnose.h>
#ifndef INCLUDED_STRING_H
#include <string.h>
@@ -49,7 +50,6 @@
#include "alloc_impl.h"
#include "internal/once.h"
#include "sal/macros.h"
-#include "osl/diagnose.h"
/* ================================================================= *
*
@@ -97,8 +97,8 @@
*
* ================================================================= */
-static void
-rtl_memory_once_init (void)
+void
+rtl_memory_init (void)
{
{
/* global memory arena */
@@ -136,36 +136,10 @@
}
}
}
-}
-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);
+ 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)
{
@@ -190,6 +164,7 @@
rtl_arena_destroy (gp_alloc_arena);
gp_alloc_arena = 0;
}
+ OSL_TRACE("rtl_memory_fini completed");
}
/* ================================================================= *
@@ -198,6 +173,8 @@
*
* ================================================================= */
+extern void ensureMemorySingleton();
+
void *
SAL_CALL rtl_allocateMemory (sal_Size n) SAL_THROW_EXTERN_C()
{
@@ -227,7 +204,8 @@
}
else if (gp_alloc_arena == 0)
{
- if (rtl_memory_init())
+ ensureMemorySingleton();
+ if (gp_alloc_arena)
{
/* try again */
goto try_alloc;
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
@@ -95,11 +95,8 @@
$(SLO)$/math.obj \
$(SLO)$/alloc_global.obj\
$(SLO)$/alloc_cache.obj \
- $(SLO)$/alloc_arena.obj
-
-.IF "$(OS)"=="MACOSX" || "$(OS)"=="AIX"
-SLOFILES+=$(SLO)$/memory_fini.obj
-.ENDIF
+ $(SLO)$/alloc_arena.obj \
+ $(SLO)$/memory_fini.obj
#.IF "$(UPDATER)"=="YES"
@@ -128,11 +125,8 @@
$(OBJ)$/math.obj \
$(OBJ)$/alloc_global.obj\
$(OBJ)$/alloc_cache.obj \
- $(OBJ)$/alloc_arena.obj
-
-.IF "$(OS)"=="MACOSX" || "$(OS)"=="AIX"
-OBJFILES+=$(OBJ)$/memory_fini.obj
-.ENDIF
+ $(OBJ)$/alloc_arena.obj \
+ $(OBJ)$/memory_fini.obj
APP1TARGET=gen_makefile
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);