X-Git-Url: http://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=test_urcu_timing.c;h=ac23846d784f783c1c34d86beab2323bc8381995;hp=6161192d0b75ea8a881edb25c065a9f0f5afba86;hb=037d4452a3739f823df8e784745b76ac65308df1;hpb=20bf310ac72677961e55867dd64d058f77e0d7e6 diff --git a/test_urcu_timing.c b/test_urcu_timing.c index 6161192..ac23846 100644 --- a/test_urcu_timing.c +++ b/test_urcu_timing.c @@ -34,23 +34,30 @@ static inline pid_t gettid(void) } #endif -#define rdtscll(val) do { \ - unsigned int __a,__d; \ - asm volatile("rdtsc" : "=a" (__a), "=d" (__d)); \ - (val) = ((unsigned long)__a) | (((unsigned long)__d)<<32); \ -} while(0) +#include "urcu.h" -typedef unsigned long long cycles_t; +pthread_mutex_t rcu_copy_mutex = PTHREAD_MUTEX_INITIALIZER; -static inline cycles_t get_cycles (void) +void rcu_copy_mutex_lock(void) { - unsigned long long ret = 0; - - rdtscll(ret); - return ret; + int ret; + ret = pthread_mutex_lock(&rcu_copy_mutex); + if (ret) { + perror("Error in pthread mutex lock"); + exit(-1); + } } -#include "urcu.h" +void rcu_copy_mutex_unlock(void) +{ + int ret; + + ret = pthread_mutex_unlock(&rcu_copy_mutex); + if (ret) { + perror("Error in pthread mutex unlock"); + exit(-1); + } +} struct test_array { int a; @@ -71,7 +78,7 @@ static cycles_t reader_time[NR_READ] __attribute__((aligned(128))); void *thr_reader(void *arg) { - int qparity, i, j; + int i, j; struct test_array *local_ptr; cycles_t time1, time2; @@ -84,12 +91,12 @@ void *thr_reader(void *arg) time1 = get_cycles(); for (i = 0; i < OUTER_READ_LOOP; i++) { for (j = 0; j < INNER_READ_LOOP; j++) { - qparity = rcu_read_lock(); + rcu_read_lock(); local_ptr = rcu_dereference(test_rcu_pointer); if (local_ptr) { assert(local_ptr->a == 8); } - rcu_read_unlock(qparity); + rcu_read_unlock(); } } time2 = get_cycles(); @@ -116,14 +123,14 @@ void *thr_writer(void *arg) for (i = 0; i < WRITE_LOOP; i++) { new = malloc(sizeof(struct test_array)); - rcu_write_lock(); + rcu_copy_mutex_lock(); old = test_rcu_pointer; if (old) { assert(old->a == 8); } new->a = 8; - old = urcu_publish_content((void **)&test_rcu_pointer, new); - rcu_write_unlock(); + old = urcu_publish_content(&test_rcu_pointer, new); + rcu_copy_mutex_unlock(); /* can be done after unlock */ if (old) { old->a = 0;