X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=util%2Ftstflock.c;h=a9ca1d72277b30f351ae2ba5678ddef2e46fc038;hb=efbacfd3929039959d79f4a2ae8a9dfbf9f548ed;hp=314fb067f5daa8d5f355075c908e689a02c17f56;hpb=26dbe80fbe19c043db62765b41bcb496c91cbd78;p=idzebra-moved-to-github.git diff --git a/util/tstflock.c b/util/tstflock.c index 314fb06..a9ca1d7 100644 --- a/util/tstflock.c +++ b/util/tstflock.c @@ -1,11 +1,14 @@ /* - * 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.5 2006-05-03 09:42:39 marc Exp $ + * $Id: tstflock.c,v 1.10 2006-06-30 13:02:20 adam Exp $ */ +#include +#include #include +#include #if YAZ_POSIX_THREADS #include #endif @@ -20,10 +23,10 @@ #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 static void small_sleep() { @@ -33,21 +36,45 @@ static void small_sleep() sleep(1); #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; + + if (use_write_lock == 2) + write_lock = (rand() & 3) == 3 ? 1 : 0; + else + write_lock = use_write_lock; + + if (write_lock) + { + zebra_lock_w(lh); + + *seqp++ = 'L'; + small_sleep(); + *seqp++ = 'U'; + + zebra_unlock(lh); + } + else + { + zebra_lock_r(lh); + + *seqp++ = 'l'; + small_sleep(); + *seqp++ = 'u'; + + zebra_unlock(lh); + } } zebra_lock_destroy(lh); + *pdata = 123; return 0; } @@ -57,60 +84,100 @@ 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