X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=util%2Ftstflock.c;h=ae4861c09c5fd309f3d079f023b5f974370294f7;hb=2d6f6f8688e1fcd5c607771a4e0008ad2498acd3;hp=6ff2dfe93fe3ff40c84b1d9b1bdff63e25f7c23c;hpb=85baa2f829cd740862eb6248fb2bde6553e6989f;p=idzebra-moved-to-github.git diff --git a/util/tstflock.c b/util/tstflock.c index 6ff2dfe..ae4861c 100644 --- a/util/tstflock.c +++ b/util/tstflock.c @@ -1,11 +1,38 @@ /* - * Copyright (C) 1995-2005, Index Data ApS + * Copyright (C) 1995-2006, Index Data ApS * See the file LICENSE for details. * - * $Id: tstflock.c,v 1.4 2006-03-23 17:50:17 adam Exp $ + * $Id: tstflock.c,v 1.15 2006-07-05 12:33:38 adam Exp $ */ +#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 @@ -15,39 +42,84 @@ #endif #include -#if HAVE_UNISTD_H -#include -#endif #include -static char seq[20]; -static char *seqp = seq; +static char seq[1000]; +static char *seqp = 0; -#define NUM_THREADS 2 +#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 + +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 } + void *run_func(void *arg) { int i; + int *pdata = (int*) arg; + int use_write_lock = *pdata; ZebraLockHandle lh = zebra_lock_create(0, "my.LCK"); for (i = 0; i<2; i++) { - zebra_lock_w(lh); - - *seqp++ = 'L'; - small_sleep(); - *seqp++ = 'U'; - - zebra_unlock(lh); + 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'; + 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); + } } zebra_lock_destroy(lh); + *pdata = 123; return 0; } @@ -57,61 +129,127 @@ DWORD WINAPI ThreadProc(void *p) run_func(p); return 0; } +#endif -static void tst_win32() +static void tst_thread(int num, int write_flag) { +#ifdef WIN32 HANDLE handles[NUM_THREADS]; DWORD dwThreadId[NUM_THREADS]; - int i, id[NUM_THREADS]; - - for (i = 0; i