X-Git-Url: https://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=test_urcu_timing.c;h=cf70709c9fe7e58beaab0f2e3920391d06f43d02;hp=6161192d0b75ea8a881edb25c065a9f0f5afba86;hb=af02d47e5d0712e5ccde6d8f1ee89f18de798cad;hpb=20bf310ac72677961e55867dd64d058f77e0d7e6 diff --git a/test_urcu_timing.c b/test_urcu_timing.c index 6161192..cf70709 100644 --- a/test_urcu_timing.c +++ b/test_urcu_timing.c @@ -5,7 +5,19 @@ * * Copyright February 2009 - Mathieu Desnoyers * - * Distributed under GPLv2 + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along + * with this program; if not, write to the Free Software Foundation, Inc., + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ #include @@ -18,6 +30,7 @@ #include #include #include +#include #if defined(_syscall0) _syscall0(pid_t, gettid) @@ -34,23 +47,31 @@ 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) +#define _LGPL_SOURCE +#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 +92,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; @@ -79,22 +100,22 @@ void *thr_reader(void *arg) "reader", pthread_self(), (unsigned long)gettid()); sleep(2); - urcu_register_thread(); + rcu_register_thread(); 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(); - urcu_unregister_thread(); + rcu_unregister_thread(); reader_time[(unsigned long)arg] = time2 - time1; @@ -116,14 +137,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 = rcu_publish_content(&test_rcu_pointer, new); + rcu_copy_mutex_unlock(); /* can be done after unlock */ if (old) { old->a = 0;