From: Mathieu Desnoyers Date: Sun, 26 Apr 2009 23:13:58 +0000 (-0400) Subject: Remove unneeded signal in the cache-coherent case X-Git-Tag: v0.1~254 X-Git-Url: http://git.liburcu.org/?p=urcu.git;a=commitdiff_plain;h=e8043c1b4278ffaa886393b2ba601c08ae649e69;hp=83aa4dc832570a302b491f0322661fb8ab867717 Remove unneeded signal in the cache-coherent case the "reader kick" signal is only needed to perform a smp_mc() on readers, which is pointless in a cache-coherent arch. Signed-off-by: Mathieu Desnoyers --- diff --git a/urcu.c b/urcu.c index 38abf7d..40514c3 100644 --- a/urcu.c +++ b/urcu.c @@ -15,6 +15,7 @@ #include #include #include +#include #include "urcu.h" @@ -99,17 +100,19 @@ static void switch_next_urcu_qparity(void) } #ifdef DEBUG_FULL_MB +#ifdef HAS_INCOHERENT_CACHES static void force_mb_single_thread(struct reader_registry *index) { smp_mb(); } +#endif /* #ifdef HAS_INCOHERENT_CACHES */ static void force_mb_all_threads(void) { smp_mb(); } -#else - +#else /* #ifdef DEBUG_FULL_MB */ +#ifdef HAS_INCOHERENT_CACHES static void force_mb_single_thread(struct reader_registry *index) { assert(registry); @@ -132,6 +135,7 @@ static void force_mb_single_thread(struct reader_registry *index) } smp_mb(); /* read ->need_mb before ending the barrier */ } +#endif /* #ifdef HAS_INCOHERENT_CACHES */ static void force_mb_all_threads(void) { @@ -174,7 +178,7 @@ static void force_mb_all_threads(void) } smp_mb(); /* read ->need_mb before ending the barrier */ } -#endif +#endif /* #else #ifdef DEBUG_FULL_MB */ void wait_for_quiescent_state(void) { @@ -186,6 +190,10 @@ void wait_for_quiescent_state(void) * Wait for each thread urcu_active_readers count to become 0. */ for (index = registry; index < registry + num_readers; index++) { +#ifndef HAS_INCOHERENT_CACHES + while (rcu_old_gp_ongoing(index->urcu_active_readers)) + cpu_relax(); +#else /* #ifndef HAS_INCOHERENT_CACHES */ int wait_loops = 0; /* * BUSY-LOOP. Force the reader thread to commit its @@ -199,6 +207,7 @@ void wait_for_quiescent_state(void) cpu_relax(); } } +#endif /* #else #ifndef HAS_INCOHERENT_CACHES */ } } @@ -360,4 +369,4 @@ void __attribute__((destructor)) urcu_exit(void) assert(act.sa_sigaction == sigurcu_handler); free(registry); } -#endif +#endif /* #ifndef DEBUG_FULL_MB */