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)


Reply via email to