* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#define _GNU_SOURCE
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#include <sys/wait.h>
#include <unistd.h>
#include <stdio.h>
-#include <assert.h>
#include <pthread.h>
#include <errno.h>
#include <urcu/arch.h>
+#include <urcu/assert.h>
#include "thread-id.h"
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 };
#define NR_READ num_read
#define NR_WRITE num_write
-static cycles_t __attribute__((aligned(CAA_CACHE_LINE_SIZE))) *reader_time;
-static cycles_t __attribute__((aligned(CAA_CACHE_LINE_SIZE))) *writer_time;
+static caa_cycles_t __attribute__((aligned(CAA_CACHE_LINE_SIZE))) *reader_time;
+static caa_cycles_t __attribute__((aligned(CAA_CACHE_LINE_SIZE))) *writer_time;
+static
void *thr_reader(void *arg)
{
- int i, j;
- cycles_t time1, time2;
+ unsigned int i, j;
+ int ret;
+ caa_cycles_t time1, time2;
printf("thread_begin %s, tid %lu\n",
"reader", urcu_get_thread_id());
time1 = caa_get_cycles();
for (i = 0; i < OUTER_READ_LOOP; i++) {
for (j = 0; j < INNER_READ_LOOP; j++) {
- pthread_rwlock_rdlock(&lock);
- assert(test_array.a == 8);
- pthread_rwlock_unlock(&lock);
+ ret = pthread_rwlock_rdlock(&lock);
+ if (ret) {
+ fprintf(stderr, "reader pthread_rwlock_rdlock: %s\n", strerror(ret));
+ abort();
+ }
+
+ urcu_posix_assert(test_array.a == 8);
+
+ ret = pthread_rwlock_unlock(&lock);
+ if (ret) {
+ fprintf(stderr, "reader pthread_rwlock_unlock: %s\n", strerror(ret));
+ abort();
+ }
}
}
time2 = caa_get_cycles();
}
+static
void *thr_writer(void *arg)
{
- int i, j;
- cycles_t time1, time2;
+ unsigned int i, j;
+ int ret;
+ caa_cycles_t time1, time2;
printf("thread_begin %s, tid %lu\n",
"writer", urcu_get_thread_id());
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);
pthread_t *tid_reader, *tid_writer;
void *tret;
int i;
- cycles_t tot_rtime = 0;
- cycles_t tot_wtime = 0;
+ caa_cycles_t tot_rtime = 0;
+ caa_cycles_t tot_wtime = 0;
if (argc < 2) {
printf("Usage : %s nr_readers nr_writers\n", argv[0]);
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);