X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=util%2Ftstflock.c;h=d481fc52ed64f5ec488bf21b11c68f083f507d23;hp=a9ca1d72277b30f351ae2ba5678ddef2e46fc038;hb=c401b3a1421e31b3d6b77bc7bac6ffb934207df1;hpb=efbacfd3929039959d79f4a2ae8a9dfbf9f548ed diff --git a/util/tstflock.c b/util/tstflock.c index a9ca1d7..d481fc5 100644 --- a/util/tstflock.c +++ b/util/tstflock.c @@ -1,14 +1,53 @@ -/* - * 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.17 2006-10-29 17:20:02 adam Exp $ + Copyright (C) 1995-2006 + Index Data ApS + +This file is part of the Zebra server. + +Zebra is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +Zebra is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA + +*/ #include #include #include #include +#if HAVE_SYS_TIME_H +#include +#endif +#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 + +#ifdef WIN32 +#include +#endif + #if YAZ_POSIX_THREADS #include #endif @@ -18,9 +57,6 @@ #endif #include -#if HAVE_UNISTD_H -#include -#endif #include static char seq[1000]; @@ -28,12 +64,34 @@ static char *seqp = 0; #define NUM_THREADS 100 -static void small_sleep() +#if YAZ_POSIX_THREADS +pthread_cond_t sleep_cond = PTHREAD_COND_INITIALIZER; +pthread_mutex_t sleep_mutex = PTHREAD_MUTEX_INITIALIZER; +#endif + +int test_fd = 0; + +static void small_sleep(void) { #ifdef WIN32 - Sleep(50); + Sleep(2); #else - sleep(1); +#if YAZ_POSIX_THREADS + struct timespec abstime; + struct timeval now; + + gettimeofday(&now, 0); + abstime.tv_sec = now.tv_sec; + abstime.tv_nsec = 1000000 + now.tv_usec * 1000; + if (abstime.tv_nsec > 1000000000) /* 1s = 1e9 ns */ + { + abstime.tv_nsec -= 1000000000; + abstime.tv_sec++; + } + pthread_mutex_lock(&sleep_mutex); + pthread_cond_timedwait(&sleep_cond, &sleep_mutex, &abstime); + pthread_mutex_unlock(&sleep_mutex); +#endif #endif } @@ -45,30 +103,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); } @@ -130,14 +190,13 @@ static void tst_thread(int num, int write_flag) for (i = 0; i < num; i++) YAZ_CHECK(id[i] == 123); *seqp++ = '\0'; + yaz_log(YLOG_LOG, "tst_thread(%d,%d) returns seq=%s", + num, write_flag, seq); } -static void tst() +static void tst(void) { tst_thread(4, 1); /* write locks */ -#if 0 - printf("seq=%s\n", seq); -#endif if (1) { int i = 0; @@ -149,26 +208,59 @@ static void tst() } } -#if 0 tst_thread(6, 0); /* read locks */ - printf("seq=%s\n", seq); -#endif -#if 0 + tst_thread(20, 2); /* random locks */ - printf("seq=%s\n", seq); +} + +void fork_tst(void) +{ +#if HAVE_SYS_WAIT_H + pid_t pid[2]; + int i; + + for (i = 0; i<2; i++) + { + pid[i] = fork(); + if (!pid[i]) + { + tst(); + exit(0); + } + } + 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); - yaz_log_time_format("%s:%!"); + sprintf(logname, "%.200s.log", argv[0]); + yaz_log_init_file(logname); - zebra_flock_init(); + /* log time + thread id (%!) */ + yaz_log_time_format("%c:%!"); - tst(); + /* ensure the flock system logs in our test */ + yaz_log_init_level(yaz_log_mask_str("flock")); + zebra_flock_init(); + + 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; }