36 #include <sys/types.h>
62 static char seq[1000];
65 #define NUM_THREADS 100
68 pthread_cond_t sleep_cond = PTHREAD_COND_INITIALIZER;
69 pthread_mutex_t sleep_mutex = PTHREAD_MUTEX_INITIALIZER;
80 struct timespec abstime;
83 gettimeofday(&now, 0);
84 abstime.tv_sec = now.tv_sec;
85 abstime.tv_nsec = 1000000 + now.tv_usec * 1000;
86 if (abstime.tv_nsec > 1000000000)
88 abstime.tv_nsec -= 1000000000;
91 pthread_mutex_lock(&sleep_mutex);
92 pthread_cond_timedwait(&sleep_cond, &sleep_mutex, &abstime);
93 pthread_mutex_unlock(&sleep_mutex);
101 int *pdata = (
int*) arg;
102 int use_write_lock = *pdata;
104 for (i = 0; i<2; i++)
106 int write_lock = use_write_lock;
108 if (use_write_lock == 2)
109 write_lock = (rand() & 3) == 3 ? 1 : 0;
142 DWORD WINAPI ThreadProc(
void *p)
155 #if YAZ_POSIX_THREADS
162 for (i = 0; i < num; i++)
165 #if YAZ_POSIX_THREADS
166 pthread_create(&child_thread[i], 0 ,
run_func, &
id[i]);
171 void *pData = &
id[i];
172 handles[i] = CreateThread(
183 #if YAZ_POSIX_THREADS
184 for (i = 0; i<num; i++)
185 pthread_join(child_thread[i], 0);
188 WaitForMultipleObjects(num, handles, TRUE, INFINITE);
190 for (i = 0; i < num; i++)
191 YAZ_CHECK(
id[i] == 123);
193 yaz_log(YLOG_LOG,
"tst_thread(%d,%d) returns seq=%s",
194 num, write_flag,
seq);
205 YAZ_CHECK_EQ(
seq[i],
'L');
206 YAZ_CHECK_EQ(
seq[i+1],
'U');
222 for (i = 0; i<2; i++)
231 for (i = 0; i<2; i++)
234 waitpid(pid[i], &status, 0);
235 YAZ_CHECK(status == 0);
242 int main(
int argc,
char **argv)
244 YAZ_CHECK_INIT(argc, argv);
248 yaz_log_init_level(yaz_log_mask_str(
"flock"));
ZebraLockHandle zebra_lock_create(const char *dir, const char *file)
void zebra_flock_init(void)
int zebra_lock_r(ZebraLockHandle h)
int zebra_lock_w(ZebraLockHandle h)
void zebra_lock_destroy(ZebraLockHandle h)
int zebra_unlock(ZebraLockHandle h)
static void tst_thread(int num, int write_flag)
int main(int argc, char **argv)
void * run_func(void *arg)
static void small_sleep(void)