Avoid declaration after statement
[idzebra-moved-to-github.git] / util / flock.c
index 62fd4ac..f91f25b 100644 (file)
@@ -1,4 +1,4 @@
-/* $Id: flock.c,v 1.1 2006-03-23 09:15:25 adam Exp $
+/* $Id: flock.c,v 1.6 2006-04-13 12:42:57 mike Exp $
    Copyright (C) 1995-2005
    Index Data ApS
 
@@ -37,11 +37,15 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA
 
 #include <idzebra/flock.h>
 #include <yaz/xmalloc.h>
+#include <yaz/log.h>
 
 struct zebra_lock_info {
     int fd;
+    char *fname;
 };
 
+static int log_level = 0 /* YLOG_LOG|YLOG_FLUSH */;
+
 char *zebra_mk_fname (const char *dir, const char *name)
 {
     int dlen = dir ? strlen(dir) : 0;
@@ -91,9 +95,11 @@ ZebraLockHandle zebra_lock_create (const char *dir, const char *name)
     if (h->fd == -1)
     {
        xfree (h);
-        h = 0;
+       yaz_log(YLOG_WARN | YLOG_ERRNO, "zebra_lock_create fail fname=%s", fname);
+        return 0;
     }
-    xfree (fname);
+    h->fname = fname;
+    yaz_log(log_level, "zebra_lock_create fd=%d p=%p fname=%s", h->fd, h, h->fname);
     return h;
 }
 
@@ -101,8 +107,10 @@ void zebra_lock_destroy (ZebraLockHandle h)
 {
     if (!h)
        return;
+    yaz_log(log_level, "zebra_lock_destroy fd=%d p=%p fname=%s", h->fd, h, h->fname);
     if (h->fd != -1)
        close (h->fd);
+    xfree (h->fname);
     xfree (h);
 }
 
@@ -119,24 +127,35 @@ static int unixLock (int fd, int type, int cmd)
 
 int zebra_lock_w (ZebraLockHandle h)
 {
+    int r;
+    yaz_log(log_level, "zebra_lock_w fd=%d p=%p fname=%s", h->fd, h, h->fname);
 #ifdef WIN32
-    return _locking (h->fd, _LK_LOCK, 1);
+    while ((r = _locking (h->fd, _LK_LOCK, 1)))
+        ;
 #else
-    return unixLock (h->fd, F_WRLCK, F_SETLKW);
+    r = unixLock (h->fd, F_WRLCK, F_SETLKW);
 #endif
+    yaz_log(log_level, "zebra_lock_w fd=%d p=%p fname=%s OK", h->fd, h, h->fname);
+    return r;
 }
 
 int zebra_lock_r (ZebraLockHandle h)
 {
+    int r;
+    yaz_log(log_level, "zebra_lock_r fd=%d p=%p fname=%s", h->fd, h, h->fname);
 #ifdef WIN32
-    return _locking (h->fd, _LK_LOCK, 1);
+    while ((r = _locking (h->fd, _LK_LOCK, 1)))
+        ;
 #else
-    return unixLock (h->fd, F_RDLCK, F_SETLKW);
+    r = unixLock (h->fd, F_RDLCK, F_SETLKW);
 #endif
+    yaz_log(log_level, "zebra_lock_r fd=%d p=%p fname=%s OK", h->fd, h, h->fname);
+    return r;
 }
 
 int zebra_unlock (ZebraLockHandle h)
 {
+    yaz_log(log_level, "zebra_unlock fd=%d p=%p fname=%s", h->fd, h, h->fname);
 #ifdef WIN32
     return _locking (h->fd, _LK_UNLCK, 1);
 #else