Fix wrapper function for creating standard mutex. Fix destruction of Mutex attribute.
[yaz-moved-to-github.git] / src / mutex.c
index aeaf221..85b0c7b 100644 (file)
 #include <yaz/nmem.h>
 #include <yaz/log.h>
 #include <yaz/mutex.h>
-
+#include <yaz/gettimeofday.h>
 #ifdef WIN32
 #include <windows.h>
+#include <sys/timeb.h>
 #endif
+#include <time.h>
 
 #if HAVE_SYS_TIME_H
 #include <sys/time.h>
 #include <pthread.h>
 #endif
 
-struct yaz_mutex {
-#ifdef WIN32
-    CRITICAL_SECTION handle;
-#elif YAZ_POSIX_THREADS
-    pthread_mutex_t handle;
-#endif
-    char *name;
-    int log_level;
-};
+#include "mutex-p.h"
 
-void yaz_mutex_create(YAZ_MUTEX *p)
-{
+void yaz_mutex_create_attr(YAZ_MUTEX *p, int flags) {
     if (!*p)
     {
         *p = (YAZ_MUTEX) malloc(sizeof(**p));
 #ifdef WIN32
         InitializeCriticalSection(&(*p)->handle);
 #elif YAZ_POSIX_THREADS
-        pthread_mutex_init(&(*p)->handle, 0);
+        (*p)->attr = malloc(sizeof( (*p)->attr));
+        pthread_mutexattr_init((*p)->attr);
+        pthread_mutexattr_settype((*p)->attr, flags);
+        pthread_mutex_init(&(*p)->handle, (*p)->attr);
 #endif
         (*p)->name = 0;
         (*p)->log_level = 0;
     }
 }
 
+void yaz_mutex_create(YAZ_MUTEX *p) {
+    yaz_mutex_create_attr(p, 0);
+}
+
 void yaz_mutex_set_name(YAZ_MUTEX p, int log_level, const char *name)
 {
     if (p->name)
@@ -100,7 +100,7 @@ void yaz_mutex_enter(YAZ_MUTEX p)
                 d = 1000000LL * ((long long) tv2.tv_sec - tv1.tv_sec) +
                     tv2.tv_usec - tv1.tv_usec;
                 yaz_log(p->log_level, "yaz_mutex_enter: %p tid=%p name=%s "
-                        "lock delay=%lld",
+                        "lock delay %lld",
                         p, (void *) pthread_self(), p->name, d);
 #endif
             }
@@ -148,6 +148,8 @@ void yaz_mutex_destroy(YAZ_MUTEX *p)
 #ifdef WIN32
         DeleteCriticalSection(&(*p)->handle);
 #elif YAZ_POSIX_THREADS
+        pthread_mutexattr_destroy((*p)->attr);
+        free((*p)->attr);
         pthread_mutex_destroy(&(*p)->handle);
 #endif
         if ((*p)->name)