+
+struct nmem_mutex {
+#ifdef WIN32
+ CRITICAL_SECTION m_handle;
+#elif _REENTRANT
+ pthread_mutex_t m_handle;
+#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;
+}
+