X-Git-Url: http://git.indexdata.com/?p=idzebra-moved-to-github.git;a=blobdiff_plain;f=util%2Ftstflock.c;h=76166b493283fd47524de609fd3ec7a0e98720c1;hp=cf2039bfcd5dd5a4721e77c5db58c5a4cbb69984;hb=4478d785b7769691261005c98063b98a5a5971b3;hpb=bd3a317131488141726cedfba9f86b9e479c5385 diff --git a/util/tstflock.c b/util/tstflock.c index cf2039b..76166b4 100644 --- a/util/tstflock.c +++ b/util/tstflock.c @@ -1,12 +1,53 @@ -/* - * Copyright (C) 1995-2006, Index Data ApS - * See the file LICENSE for details. - * - * $Id: tstflock.c,v 1.7 2006-06-27 11:56:29 adam Exp $ - */ +/* $Id: tstflock.c,v 1.16 2006-08-14 10:40:34 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 @@ -16,22 +57,41 @@ #endif #include -#if HAVE_UNISTD_H -#include -#endif #include -static char seq[40]; -static char *seqp = seq; +static char seq[1000]; +static char *seqp = 0; + +#define NUM_THREADS 100 + +#if YAZ_POSIX_THREADS +pthread_cond_t sleep_cond = PTHREAD_COND_INITIALIZER; +pthread_mutex_t sleep_mutex = PTHREAD_MUTEX_INITIALIZER; +#endif -#define NUM_THREADS 5 +int test_fd = 0; static void small_sleep() { #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 } @@ -43,23 +103,32 @@ void *run_func(void *arg) ZebraLockHandle lh = zebra_lock_create(0, "my.LCK"); for (i = 0; i<2; i++) { - if (use_write_lock) + int write_lock = use_write_lock; + + if (use_write_lock == 2) /* random lock */ + write_lock = (rand() & 3) == 3 ? 1 : 0; + + 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); } @@ -75,72 +144,123 @@ DWORD WINAPI ThreadProc(void *p) run_func(p); return 0; } +#endif -static void tst_win32(int num) +static void tst_thread(int num, int write_flag) { +#ifdef WIN32 HANDLE handles[NUM_THREADS]; DWORD dwThreadId[NUM_THREADS]; - int i, id[NUM_THREADS]; - - assert (num <= NUM_THREADS); - for (i = 0; i= 2 ? 0 : 1; /* first two are writing.. rest is reading */ - handles[i] = CreateThread( - NULL, /* default security attributes */ - 0, /* use default stack size */ - ThreadProc, /* thread function */ - pData, /* argument to thread function */ - 0, /* use default creation flags */ - &dwThreadId[i]); /* returns the thread identifier */ - } - /* join */ - WaitForMultipleObjects(NUM_THREADS, handles, TRUE, INFINITE); -} #endif - #if YAZ_POSIX_THREADS -static void tst_pthread(int num) -{ pthread_t child_thread[NUM_THREADS]; +#endif int i, id[NUM_THREADS]; + seqp = seq; assert (num <= NUM_THREADS); - for (i = 0; i= 2 ? 0 : 1; /* first two are writing.. rest is reading */ + id[i] = write_flag; +#if YAZ_POSIX_THREADS pthread_create(&child_thread[i], 0 /* attr */, run_func, &id[i]); - } +#endif +#ifdef WIN32 + if (1) + { + void *pData = &id[i]; + handles[i] = CreateThread( + NULL, /* default security attributes */ + 0, /* use default stack size */ + ThreadProc, /* thread function */ + pData, /* argument to thread function */ + 0, /* use default creation flags */ + &dwThreadId[i]); /* returns the thread identifier */ + } +#endif + } +#if YAZ_POSIX_THREADS for (i = 0; i