/*
- * 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.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
+#ifdef _REENTRANT
#if HAVE_PTHREAD_H
#include <pthread.h>
-#elif HAVE_THREAD_H
-#include <thread.h>
+#elif HAVE_PTH_H
+#include <pth.h>
#endif
#endif
static CRITICAL_SECTION critical_section;
#define NMEM_ENTER EnterCriticalSection(&critical_section)
#define NMEM_LEAVE LeaveCriticalSection(&critical_section)
-#elif _REENTRANT
+#endif
+
+#ifdef _REENTRANT
+#if HAVE_PTHREAD_H
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);
+#elif HAVE_PTH_H
+static pth_mutex_t nmem_mutex;
+#define NMEM_ENTER pth_mutex_acquire(&nmem_mutex, 0, 0)
+#define NMEM_LEAVE pth_mutex_release(&nmem_mutex)
+#else
+#error x
+#endif
#else
#define NMEM_ENTER
#define NMEM_LEAVE
#endif
+struct nmem_mutex {
+#ifdef WIN32
+ CRITICAL_SECTION m_handle;
+#elif _REENTRANT
+
+#if HAVE_PTHREAD_H
+ pthread_mutex_t m_handle;
+#elif HAVE_PTH_H
+ pth_mutex_t m_handle;
+#endif
+
+#else
+ int m_handle;
+#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 _REENTRANT
+ pthread_mutex_init (&(*p)->m_handle, 0);
+#endif
+ }
+ NMEM_LEAVE;
+}
+
+YAZ_EXPORT void nmem_mutex_enter(NMEM_MUTEX p)
+{
+ if (p)
+ {
+#ifdef WIN32
+ EnterCriticalSection(&p->m_handle);
+#elif _REENTRANT
+ 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 _REENTRANT
+ 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;
#ifdef WIN32
InitializeCriticalSection(&critical_section);
#endif
+
+#ifdef _REENTRANT
+#if HAVE_PTH_H
+ yaz_log (LOG_LOG, "pth_init");
+ pth_init ();
+ pth_mutex_init (&nmem_mutex);
+#endif
+#endif
nmem_active_no = 0;
freelist = NULL;
cfreelist = NULL;
{
if (--nmem_init_flag == 0)
{
+ oid_exit();
while (freelist)
{
struct nmem_block *fl = freelist;