Author: ydario
Date: Fri Nov 8 10:22:55 2013
New Revision: 1539965
URL: http://svn.apache.org/r1539965
Log:
i123001 - force destructor to be called before libc calls DosExit().
Modified:
openoffice/trunk/main/sal/rtl/source/alloc_cache.c
Modified: openoffice/trunk/main/sal/rtl/source/alloc_cache.c
URL:
http://svn.apache.org/viewvc/openoffice/trunk/main/sal/rtl/source/alloc_cache.c?rev=1539965&r1=1539964&r2=1539965&view=diff
==============================================================================
--- openoffice/trunk/main/sal/rtl/source/alloc_cache.c (original)
+++ openoffice/trunk/main/sal/rtl/source/alloc_cache.c Fri Nov 8 10:22:55 2013
@@ -39,6 +39,10 @@
#ifdef OS2
#undef OSL_TRACE
#define OSL_TRACE 1 ? ((void)0) : _OSL_GLOBAL osl_trace
+
+#define INCL_DOS
+#include <os2.h>
+
#endif
/* ================================================================= *
@@ -55,9 +59,12 @@ struct rtl_cache_list_st
rtl_memory_lock_type m_lock;
rtl_cache_type m_cache_head;
-#if defined(SAL_UNX) || defined(SAL_OS2)
+#if defined(SAL_UNX)
pthread_t m_update_thread;
pthread_cond_t m_update_cond;
+#elif defined(SAL_OS2)
+ TID m_update_thread;
+ HEV m_update_cond;
#elif defined(SAL_W32)
HANDLE m_update_thread;
HANDLE m_update_cond;
@@ -1376,7 +1383,7 @@ rtl_cache_wsupdate_fini (void);
/* ================================================================= */
-#if defined(SAL_UNX) || defined(SAL_OS2)
+#if defined(SAL_UNX)
#include <sys/time.h>
@@ -1431,6 +1438,62 @@ rtl_cache_wsupdate_fini (void)
/* ================================================================= */
+#elif defined(SAL_OS2)
+
+static void
+rtl_cache_wsupdate_all (void * arg);
+
+static void rtl_cache_fini (void);
+
+static void
+rtl_cache_wsupdate_init (void)
+{
+ ULONG ulThreadId;
+ APIRET rc;
+
+ RTL_MEMORY_LOCK_ACQUIRE(&(g_cache_list.m_lock));
+ g_cache_list.m_update_done = 0;
+
+ // we use atexit() because this allows CRT exit to process handler
before
+ // threads are killed. Otherwise with __attribute__(destructor) this
+ // function is called when DosExit starts processing DLL destruction
+ // which happens after ALL threads have been killed...
+ atexit( rtl_cache_fini);
+
+ //g_cache_list.m_update_cond = CreateEvent (0, TRUE, FALSE, 0);
+ /* Warp3 FP29 or Warp4 FP4 or better required */
+ rc = DosCreateEventSem( NULL, &g_cache_list.m_update_cond, 0x0800, 0);
+
+ g_cache_list.m_update_thread = (ULONG) _beginthread(
rtl_cache_wsupdate_all, NULL,
+ 65*1024, (void*) 10);
+ RTL_MEMORY_LOCK_RELEASE(&(g_cache_list.m_lock));
+}
+
+static void
+rtl_cache_wsupdate_wait (unsigned int seconds)
+{
+ APIRET rc;
+ if (seconds > 0)
+ {
+ RTL_MEMORY_LOCK_RELEASE(&(g_cache_list.m_lock));
+ rc = DosWaitEventSem(g_cache_list.m_update_cond, seconds*1000);
+ RTL_MEMORY_LOCK_ACQUIRE(&(g_cache_list.m_lock));
+ }
+}
+
+static void
+rtl_cache_wsupdate_fini (void)
+{
+ APIRET rc;
+ RTL_MEMORY_LOCK_ACQUIRE(&(g_cache_list.m_lock));
+ g_cache_list.m_update_done = 1;
+ rc = DosPostEventSem(g_cache_list.m_update_cond);
+ RTL_MEMORY_LOCK_RELEASE(&(g_cache_list.m_lock));
+ rc = DosWaitThread(&g_cache_list.m_update_thread, DCWW_WAIT);
+}
+
+/* ================================================================= */
+
#elif defined(SAL_W32)
static DWORD WINAPI
@@ -1542,8 +1605,10 @@ rtl_cache_wsupdate (
/** rtl_cache_wsupdate_all()
*
*/
-#if defined(SAL_UNX) || defined(SAL_OS2)
+#if defined(SAL_UNX)
static void *
+#elif defined(SAL_OS2)
+static void
#elif defined(SAL_W32)
static DWORD WINAPI
#endif /* SAL_UNX || SAL_W32 */
@@ -1570,7 +1635,9 @@ rtl_cache_wsupdate_all (void * arg)
}
RTL_MEMORY_LOCK_RELEASE(&(g_cache_list.m_lock));
+#if !defined(SAL_OS2)
return (0);
+#endif
}
/* ================================================================= *
@@ -1699,7 +1766,7 @@ rtl_cache_init (void)
Delegated the call to "rtl_cache_fini()" into a dummy C++ object,
see alloc_fini.cxx .
*/
-#if defined(__GNUC__) && !defined(MACOSX)
+#if defined(__GNUC__) && !defined(MACOSX) && !defined(SAL_OS2)
static void rtl_cache_fini (void) __attribute__((destructor));
#elif defined(__SUNPRO_C) || defined(__SUNPRO_CC)
#pragma fini(rtl_cache_fini)