WIN32 updates: ZOOM runs, nmem_init/nmem_exit called in DllMain.
[yaz-moved-to-github.git] / util / nmem.c
index 9acaaee..358d7a6 100644 (file)
@@ -1,10 +1,31 @@
 /*
- * Copyright (c) 1995-2000, Index Data.
+ * Copyright (c) 1995-2001, Index Data.
  * See the file LICENSE for details.
  * Sebastian Hammer, Adam Dickmeiss
  *
  * $Log: nmem.c,v $
- * Revision 1.24  2000-05-11 14:37:55  adam
+ * Revision 1.31  2001-10-24 12:24:43  adam
+ * WIN32 updates: ZOOM runs, nmem_init/nmem_exit called in DllMain.
+ *
+ * Revision 1.30  2001/10/05 13:55:17  adam
+ * Added defines YAZ_GNU_THREADS, YAZ_POSIX_THREADS in code and yaz-config
+ *
+ * Revision 1.29  2001/10/04 00:37:58  adam
+ * Fixes for GNU threads (not working yet).
+ *
+ * Revision 1.28  2001/10/03 23:55:18  adam
+ * GNU threads support.
+ *
+ * Revision 1.27  2001/09/27 12:09:18  adam
+ * Function nmem_exit calls oid_exit (when reference is 0).
+ *
+ * Revision 1.26  2001/07/19 19:51:42  adam
+ * Added typecasts to make C++ happy.
+ *
+ * Revision 1.25  2001/06/26 14:11:27  adam
+ * Added MUTEX functions for NMEM module (used by OID utility).
+ *
+ * Revision 1.24  2000/05/11 14:37:55  adam
  * Minor changes.
  *
  * Revision 1.23  2000/05/09 10:55:05  adam
 #include <yaz/xmalloc.h>
 #include <yaz/nmem.h>
 #include <yaz/log.h>
+#include <yaz/oid.h>
+
 #ifdef WIN32
 #include <windows.h>
-#elif _REENTRANT
+#endif
 
-#if HAVE_PTHREAD_H
+#if YAZ_POSIX_THREADS
 #include <pthread.h>
-#elif HAVE_THREAD_H
-#include <thread.h>
 #endif
 
+#if YAZ_GNU_THREADS
+#include <pth.h>
 #endif
 
 #define NMEM_CHUNK (4*1024)
 static CRITICAL_SECTION critical_section;
 #define NMEM_ENTER EnterCriticalSection(&critical_section)
 #define NMEM_LEAVE LeaveCriticalSection(&critical_section)
-#elif _REENTRANT
+struct nmem_mutex {
+    CRITICAL_SECTION m_handle;
+};
+#elif YAZ_POSIX_THREADS
 static pthread_mutex_t nmem_mutex = PTHREAD_MUTEX_INITIALIZER;
 #define NMEM_ENTER pthread_mutex_lock(&nmem_mutex);
 #define NMEM_LEAVE pthread_mutex_unlock(&nmem_mutex);
+struct nmem_mutex {
+    pthread_mutex_t m_handle;
+};
+#elif YAZ_GNU_THREADS
+static pth_mutex_t nmem_mutex = PTH_MUTEX_INIT;
+#define NMEM_ENTER pth_mutex_acquire(&nmem_mutex, 0, 0)
+#define NMEM_LEAVE pth_mutex_release(&nmem_mutex)
+struct nmem_mutex {
+    pth_mutex_t m_handle;
+};
 #else
 #define NMEM_ENTER
 #define NMEM_LEAVE
+struct nmem_mutex {
+    int dummy;
+};
 #endif
 
+YAZ_EXPORT void nmem_mutex_create(NMEM_MUTEX *p)
+{
+    NMEM_ENTER;
+    if (!*p)
+    {
+       *p = (NMEM_MUTEX) malloc (sizeof(**p));
+#ifdef WIN32
+       InitializeCriticalSection(&(*p)->m_handle);
+#elif YAZ_POSIX_THREADS
+       pthread_mutex_init (&(*p)->m_handle, 0);
+#elif YAZ_GNU_THREADS
+        pth_mutex_init (&(*p)->m_handle);
+#endif
+    }
+    NMEM_LEAVE;
+}
+
+YAZ_EXPORT void nmem_mutex_enter(NMEM_MUTEX p)
+{
+    if (p)
+    {
+#ifdef WIN32
+       EnterCriticalSection(&p->m_handle);
+#elif YAZ_POSIX_THREADS
+       pthread_mutex_lock(&p->m_handle);
+#endif
+    }
+}
+
+YAZ_EXPORT void nmem_mutex_leave(NMEM_MUTEX p)
+{
+    if (p)
+    {
+#ifdef WIN32
+       LeaveCriticalSection(&p->m_handle);
+#elif YAZ_POSIX_THREADS
+       pthread_mutex_unlock(&p->m_handle);
+#endif
+    }
+}
+
+YAZ_EXPORT void nmem_mutex_destroy(NMEM_MUTEX *p)
+{
+    NMEM_ENTER;
+    if (*p)
+    {
+#ifdef WIN32
+       DeleteCriticalSection(&(*p)->m_handle);
+#endif
+       free (*p);
+       *p = 0;
+    }
+    NMEM_LEAVE;
+}
+
 static nmem_block *freelist = NULL;        /* "global" freelists */
 static nmem_control *cfreelist = NULL;
 static int nmem_active_no = 0;
@@ -384,6 +478,9 @@ void nmem_init (void)
     {
 #ifdef WIN32
        InitializeCriticalSection(&critical_section);
+#elif YAZ_GNU_THREADS
+       yaz_log (LOG_LOG, "pth_init");
+        pth_init ();
 #endif
        nmem_active_no = 0;
        freelist = NULL;
@@ -395,6 +492,7 @@ void nmem_exit (void)
 {
     if (--nmem_init_flag == 0)
     {
+        oid_exit();
        while (freelist)
        {
            struct nmem_block *fl = freelist;
@@ -414,3 +512,20 @@ void nmem_exit (void)
     }
 }
 
+
+#ifdef WIN32
+BOOL WINAPI DllMain (HINSTANCE hinstDLL,
+                    DWORD reason,
+                    LPVOID reserved)
+{
+    switch (reason)
+    {
+    case DLL_PROCESS_ATTACH:
+       nmem_init ();
+       break;
+    case DLL_PROCESS_DETACH:
+       nmem_exit ();
+    }
+    return TRUE;
+}
+#endif
\ No newline at end of file