int a;
};
-pthread_rwlock_t lock = PTHREAD_RWLOCK_INITIALIZER;
+/*
+ * static rwlock initializer is broken on Cygwin. Use runtime
+ * initialization.
+ */
+pthread_rwlock_t lock;
static volatile int test_go, test_stop;
}
for (;;) {
- int a;
+ int a, ret;
+
+ ret = pthread_rwlock_rdlock(&lock);
+ if (ret) {
+ fprintf(stderr, "reader pthread_rwlock_rdlock: %s\n", strerror(ret));
+ abort();
+ }
- pthread_rwlock_rdlock(&lock);
a = test_array.a;
assert(a == 8);
if (caa_unlikely(rduration))
loop_sleep(rduration);
- pthread_rwlock_unlock(&lock);
+
+ ret = pthread_rwlock_unlock(&lock);
+ if (ret) {
+ fprintf(stderr, "reader pthread_rwlock_unlock: %s\n", strerror(ret));
+ abort();
+ }
+
URCU_TLS(nr_reads)++;
if (caa_unlikely(!test_duration_read()))
break;
cmm_smp_mb();
for (;;) {
- pthread_rwlock_wrlock(&lock);
+ int ret;
+
+ ret = pthread_rwlock_wrlock(&lock);
+ if (ret) {
+ fprintf(stderr, "writer pthread_rwlock_wrlock: %s\n", strerror(ret));
+ abort();
+ }
+
test_array.a = 0;
test_array.a = 8;
if (caa_unlikely(wduration))
loop_sleep(wduration);
- pthread_rwlock_unlock(&lock);
+
+ ret = pthread_rwlock_unlock(&lock);
+ if (ret) {
+ fprintf(stderr, "writer pthread_rwlock_unlock: %s\n", strerror(ret));
+ abort();
+ }
+
URCU_TLS(nr_writes)++;
if (caa_unlikely(!test_duration_write()))
break;
printf_verbose("thread %-6s, tid %lu\n",
"main", urcu_get_thread_id());
+ err = pthread_rwlock_init(&lock, NULL);
+ if (err != 0) {
+ fprintf(stderr, "pthread_rwlock_init: (%d) %s\n", err, strerror(err));
+ exit(1);
+ }
+
tid_reader = calloc(nr_readers, sizeof(*tid_reader));
tid_writer = calloc(nr_writers, sizeof(*tid_writer));
count_reader = calloc(nr_readers, sizeof(*count_reader));
nr_writers, wdelay, tot_reads, tot_writes,
tot_reads + tot_writes);
+ err = pthread_rwlock_destroy(&lock);
+ if (err != 0) {
+ fprintf(stderr, "pthread_rwlock_destroy: (%d) %s\n", err, strerror(err));
+ exit(1);
+ }
free(tid_reader);
free(tid_writer);
free(count_reader);
int a;
};
-pthread_rwlock_t lock = PTHREAD_RWLOCK_INITIALIZER;
+/*
+ * static rwlock initializer is broken on Cygwin. Use runtime
+ * initialization.
+ */
+pthread_rwlock_t lock;
static struct test_array test_array = { 8 };
void *thr_reader(void *arg)
{
- int i, j;
+ int i, j, ret;
caa_cycles_t time1, time2;
printf("thread_begin %s, tid %lu\n",
time1 = caa_get_cycles();
for (i = 0; i < OUTER_READ_LOOP; i++) {
for (j = 0; j < INNER_READ_LOOP; j++) {
- pthread_rwlock_rdlock(&lock);
+ ret = pthread_rwlock_rdlock(&lock);
+ if (ret) {
+ fprintf(stderr, "reader pthread_rwlock_rdlock: %s\n", strerror(ret));
+ abort();
+ }
+
assert(test_array.a == 8);
- pthread_rwlock_unlock(&lock);
+
+ ret = pthread_rwlock_unlock(&lock);
+ if (ret) {
+ fprintf(stderr, "reader pthread_rwlock_unlock: %s\n", strerror(ret));
+ abort();
+ }
}
}
time2 = caa_get_cycles();
void *thr_writer(void *arg)
{
- int i, j;
+ int i, j, ret;
caa_cycles_t time1, time2;
printf("thread_begin %s, tid %lu\n",
for (i = 0; i < OUTER_WRITE_LOOP; i++) {
for (j = 0; j < INNER_WRITE_LOOP; j++) {
time1 = caa_get_cycles();
- pthread_rwlock_wrlock(&lock);
+ ret = pthread_rwlock_wrlock(&lock);
+ if (ret) {
+ fprintf(stderr, "writer pthread_rwlock_wrlock: %s\n", strerror(ret));
+ abort();
+ }
+
test_array.a = 8;
- pthread_rwlock_unlock(&lock);
+
+ ret = pthread_rwlock_unlock(&lock);
+ if (ret) {
+ fprintf(stderr, "writer pthread_rwlock_unlock: %s\n", strerror(ret));
+ abort();
+ }
+
time2 = caa_get_cycles();
writer_time[(unsigned long)arg] += time2 - time1;
usleep(1);
num_read = atoi(argv[1]);
num_write = atoi(argv[2]);
+ err = pthread_rwlock_init(&lock, NULL);
+ if (err != 0) {
+ fprintf(stderr, "pthread_rwlock_init: (%d) %s\n", err, strerror(err));
+ exit(1);
+ }
+
reader_time = calloc(num_read, sizeof(*reader_time));
writer_time = calloc(num_write, sizeof(*writer_time));
tid_reader = calloc(num_read, sizeof(*tid_reader));
printf("Time per write : %g cycles\n",
(double)tot_wtime / ((double)NR_WRITE * (double)WRITE_LOOP));
+ err = pthread_rwlock_destroy(&lock);
+ if (err != 0) {
+ fprintf(stderr, "pthread_rwlock_destroy: (%d) %s\n", err, strerror(err));
+ exit(1);
+ }
free(reader_time);
free(writer_time);
free(tid_reader);