From 47ea5b58c92777d8d35376b64a1c075fecb8b104 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= 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 +#include 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{}; +} +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{}; +} +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{}; +} +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{}; +} +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 +#include #ifndef INCLUDED_STRING_H #include @@ -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);