X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=util%2Ftstflock.c;h=28d9548335588295946726b962037e9140333932;hb=7415d28c149c1bab51fe93aeaccdd14085b69bd9;hp=0d0be352d91dccd1ad12c15e876816a204cddcef;hpb=23c386f2b4511acfdb389adc7f48f15d284c639c;p=idzebra-moved-to-github.git diff --git a/util/tstflock.c b/util/tstflock.c index 0d0be35..28d9548 100644 --- a/util/tstflock.c +++ b/util/tstflock.c @@ -1,63 +1,227 @@ /* - * 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.1 2006-03-23 09:15:25 adam Exp $ + * $Id: tstflock.c,v 1.12 2006-06-30 15:10:29 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 +#ifdef WIN32 +#include +#include +#endif #include -#include #include -static char seq[20]; -static char *seqp = seq; +static char seq[1000]; +static char *seqp = 0; + +#define NUM_THREADS 100 + +int test_fd = 0; + +static void small_sleep() +{ +#ifdef WIN32 + Sleep(50); +#else + 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'; - sleep(1); - *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; } -static void tst1() +#ifdef WIN32 +DWORD WINAPI ThreadProc(void *p) { - pthread_t child_thread[2]; - int id1 = 1; - int id2 = 2; - pthread_create(&child_thread[0], 0 /* attr */, run_func, &id1); - pthread_create(&child_thread[1], 0 /* attr */, run_func, &id2); - pthread_join(child_thread[0], 0); - pthread_join(child_thread[1], 0); + run_func(p); + return 0; +} +#endif + +static void tst_thread(int num, int write_flag) +{ +#ifdef WIN32 + HANDLE handles[NUM_THREADS]; + DWORD dwThreadId[NUM_THREADS]; +#endif +#if YAZ_POSIX_THREADS + pthread_t child_thread[NUM_THREADS]; +#endif + int i, id[NUM_THREADS]; + + seqp = seq; + assert (num <= NUM_THREADS); + for (i = 0; i < num; i++) + { + 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