X-Git-Url: http://git.indexdata.com/?a=blobdiff_plain;f=util%2Ftstflock.c;h=372f9762db2a1961908255f69246027f1d11de14;hb=95283c5c6fcd51a57d71649d65b4f2196c655a4f;hp=3da7f7a47df4bf5dfe499f121e842b05434459b2;hpb=ce6df1eaab07d33544975ffe67a4b7a231cf795a;p=idzebra-moved-to-github.git diff --git a/util/tstflock.c b/util/tstflock.c index 3da7f7a..372f976 100644 --- a/util/tstflock.c +++ b/util/tstflock.c @@ -1,10 +1,11 @@ /* - * 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.2 2006-03-23 12:07:12 adam Exp $ + * $Id: tstflock.c,v 1.8 2006-06-27 12:24:14 adam Exp $ */ +#include #include #if YAZ_POSIX_THREADS #include @@ -20,10 +21,10 @@ #endif #include -static char seq[20]; +static char seq[40]; static char *seqp = seq; -#define NUM_THREADS 2 +#define NUM_THREADS 5 static void small_sleep() { @@ -33,21 +34,38 @@ 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); + if (use_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; } @@ -58,54 +76,75 @@ DWORD WINAPI ThreadProc(void *p) return 0; } -static void tst1() +static void tst_win32(int num) { HANDLE handles[NUM_THREADS]; DWORD dwThreadId[NUM_THREADS]; int i, id[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 + 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 */ } - WaitForMultipleObjects(NUM_THREADS, handles, TRUE, INFINITE); /* join */ - *seqp++ = '\0'; + WaitForMultipleObjects(num, handles, TRUE, INFINITE); } #endif #if YAZ_POSIX_THREADS -static void tst1() +static void tst_pthread(int num) { - 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); - *seqp++ = '\0'; + pthread_t child_thread[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 */ + pthread_create(&child_thread[i], 0 /* attr */, run_func, &id[i]); + } + + for (i = 0; i