X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=util%2Fflock.c;h=f91f25bd133e81a74015e716a4cedcaedac6201a;hb=8407158947485c3897c8232bf5a1f4501eb5e710;hp=62fd4ac57cf0cf88837d703b841e73bc60b4fe89;hpb=23c386f2b4511acfdb389adc7f48f15d284c639c;p=idzebra-moved-to-github.git diff --git a/util/flock.c b/util/flock.c index 62fd4ac..f91f25b 100644 --- a/util/flock.c +++ b/util/flock.c @@ -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 #include +#include 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