From 48faacdb311bbc6964f1478be2a8802d7160b000 Mon Sep 17 00:00:00 2001 From: Adam Dickmeiss Date: Fri, 30 Jun 2006 14:01:22 +0000 Subject: [PATCH] Test interprocess locks --- util/flock.c | 44 +++++++++++++++++--------------- util/tstflock.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++--------- 2 files changed, 87 insertions(+), 33 deletions(-) diff --git a/util/flock.c b/util/flock.c index 7dffe43..f936730 100644 --- a/util/flock.c +++ b/util/flock.c @@ -1,4 +1,4 @@ -/* $Id: flock.c,v 1.11 2006-06-30 13:02:20 adam Exp $ +/* $Id: flock.c,v 1.12 2006-06-30 14:01:22 adam Exp $ Copyright (C) 1995-2006 Index Data ApS @@ -50,7 +50,7 @@ Free Software Foundation, 59 Temple Place - Suite 330, Boston, MA #define ZEBRA_FLOCK_EXTRA_RDWR_LOCKS 1 /** whether this module should debug */ -#define DEBUG_FLOCK 0 +#define DEBUG_FLOCK 1 /** have this module (mutex) been initialized? */ static int initialized = 0; @@ -265,16 +265,20 @@ int zebra_lock_w(ZebraLockHandle h) int do_lock = ZEBRA_FLOCK_FILE_LOCK_ALWAYS; yaz_log(log_level, "zebra_lock_w fd=%d p=%p fname=%s begin", h->p->fd, h, h->p->fname); + #ifdef WIN32 while ((r = _locking(h->p->fd, _LK_LOCK, 1))) ; #else +#if ZEBRA_FLOCK_EXTRA_RDWR_LOCKS + zebra_lock_rdwr_wlock(&h->p->rdwr_lock); +#endif + zebra_mutex_lock(&h->p->file_mutex); if (h->p->no_file_write_lock == 0) do_lock = 1; h->p->no_file_write_lock++; - zebra_mutex_unlock(&h->p->file_mutex); if (do_lock) { yaz_log(log_level, "zebra_lock_w fd=%d p=%p fname=%s 2", @@ -282,12 +286,10 @@ int zebra_lock_w(ZebraLockHandle h) /* if there is already a read lock.. upgrade to write lock */ r = unixLock(h->p->fd, F_WRLCK, F_SETLKW); } + zebra_mutex_unlock(&h->p->file_mutex); yaz_log(log_level, "zebra_lock_w fd=%d p=%p fname=%s 3", h->p->fd, h, h->p->fname); -#if ZEBRA_FLOCK_EXTRA_RDWR_LOCKS - zebra_lock_rdwr_wlock(&h->p->rdwr_lock); -#endif h->write_flag = 1; yaz_log(log_level, "zebra_lock_w fd=%d p=%p fname=%s end", h->p->fd, h, h->p->fname); @@ -307,21 +309,21 @@ int zebra_lock_r(ZebraLockHandle h) while ((r = _locking(h->p->fd, _LK_LOCK, 1))) ; #else +#if ZEBRA_FLOCK_EXTRA_RDWR_LOCKS + zebra_lock_rdwr_rlock(&h->p->rdwr_lock); +#endif + zebra_mutex_lock(&h->p->file_mutex); if (h->p->no_file_read_lock == 0 && h->p->no_file_write_lock == 0) do_lock = 1; h->p->no_file_read_lock++; - zebra_mutex_unlock(&h->p->file_mutex); - if (do_lock) { /* only read lock if no write locks already */ r = unixLock(h->p->fd, F_RDLCK, F_SETLKW); } - -#if ZEBRA_FLOCK_EXTRA_RDWR_LOCKS - zebra_lock_rdwr_rlock(&h->p->rdwr_lock); -#endif + zebra_mutex_unlock(&h->p->file_mutex); + h->write_flag = 0; #endif return r; @@ -336,13 +338,6 @@ int zebra_unlock(ZebraLockHandle h) #ifdef WIN32 r = _locking(h->p->fd, _LK_UNLCK, 1); #else -#if ZEBRA_FLOCK_EXTRA_RDWR_LOCKS - if (h->write_flag) - zebra_lock_rdwr_wunlock(&h->p->rdwr_lock); - else - zebra_lock_rdwr_runlock(&h->p->rdwr_lock); -#endif - zebra_mutex_lock(&h->p->file_mutex); if (h->write_flag) h->p->no_file_write_lock--; @@ -350,10 +345,17 @@ int zebra_unlock(ZebraLockHandle h) h->p->no_file_read_lock--; if (h->p->no_file_read_lock == 0 && h->p->no_file_write_lock == 0) do_unlock = 1; - zebra_mutex_unlock(&h->p->file_mutex); - if (do_unlock) r = unixLock(h->p->fd, F_UNLCK, F_SETLKW); + zebra_mutex_unlock(&h->p->file_mutex); + +#if ZEBRA_FLOCK_EXTRA_RDWR_LOCKS + if (h->write_flag) + zebra_lock_rdwr_wunlock(&h->p->rdwr_lock); + else + zebra_lock_rdwr_runlock(&h->p->rdwr_lock); +#endif + yaz_log(log_level, "zebra_unlock fd=%d p=%p fname=%s end", h->p->fd, h, h->p->fname); #endif diff --git a/util/tstflock.c b/util/tstflock.c index a9ca1d7..d17c010 100644 --- a/util/tstflock.c +++ b/util/tstflock.c @@ -2,13 +2,29 @@ * Copyright (C) 1995-2006, Index Data ApS * See the file LICENSE for details. * - * $Id: tstflock.c,v 1.10 2006-06-30 13:02:20 adam Exp $ + * $Id: tstflock.c,v 1.11 2006-06-30 14:01:22 adam Exp $ */ #include #include #include #include + +#if HAVE_SYS_STAT_H +#include +#endif +#if HAVE_SYS_TYPES_H +#include +#endif +#if HAVE_UNISTD_H +#include +#endif +#if HAVE_SYS_WAIT_H +#include +#endif + +#include + #if YAZ_POSIX_THREADS #include #endif @@ -18,9 +34,6 @@ #endif #include -#if HAVE_UNISTD_H -#include -#endif #include static char seq[1000]; @@ -28,6 +41,8 @@ static char *seqp = 0; #define NUM_THREADS 100 +int test_fd = 0; + static void small_sleep() { #ifdef WIN32 @@ -45,30 +60,32 @@ void *run_func(void *arg) ZebraLockHandle lh = zebra_lock_create(0, "my.LCK"); for (i = 0; i<2; i++) { - int write_lock; + int write_lock = use_write_lock; - if (use_write_lock == 2) + if (use_write_lock == 2) /* random lock */ write_lock = (rand() & 3) == 3 ? 1 : 0; - else - write_lock = use_write_lock; if (write_lock) { zebra_lock_w(lh); - + + write(test_fd, "L", 1); *seqp++ = 'L'; small_sleep(); - *seqp++ = 'U'; - + *seqp++ = 'U'; + write(test_fd, "U", 1); + zebra_unlock(lh); } else { zebra_lock_r(lh); + write(test_fd, "l", 1); *seqp++ = 'l'; small_sleep(); *seqp++ = 'u'; + write(test_fd, "u", 1); zebra_unlock(lh); } @@ -135,6 +152,7 @@ static void tst_thread(int num, int write_flag) static void tst() { tst_thread(4, 1); /* write locks */ + yaz_log(YLOG_LOG, "seq=%s", seq); #if 0 printf("seq=%s\n", seq); #endif @@ -159,15 +177,49 @@ static void tst() #endif } +void fork_tst() +{ +#if HAVE_SYS_WAIT_H + pid_t pid[2]; + int i; + + for (i = 0; i<2; i++) + { + pid[i] = fork(); + if (!pid[i]) + { + tst(); + return; + } + } + for (i = 0; i<2; i++) + { + int status; + waitpid(pid[i], &status, 0); + YAZ_CHECK(status == 0); + } +#else + tst(); +#endif +} + + int main(int argc, char **argv) { + char logname[220]; YAZ_CHECK_INIT(argc, argv); + sprintf(logname, "%.200s.log", argv[0]); + yaz_log_init_file(logname); + yaz_log_time_format("%s:%!"); zebra_flock_init(); - tst(); + test_fd = open("tstflock.out", (O_BINARY|O_CREAT|O_RDWR), 0666); + YAZ_CHECK(test_fd != -1); + if (test_fd != -1) + fork_tst(); YAZ_CHECK_TERM; } -- 1.7.10.4