From 539718ae00831b55601635e6f065cb2aaf2aa7ae Mon Sep 17 00:00:00 2001 From: Mathieu Desnoyers Date: Sat, 26 Sep 2009 18:19:27 -0400 Subject: [PATCH] qsbr: adaptative usleep period Signed-off-by: Mathieu Desnoyers --- urcu-qsbr-static.h | 16 ++++++++-------- urcu-qsbr.c | 2 +- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/urcu-qsbr-static.h b/urcu-qsbr-static.h index d18fabd..f1300f3 100644 --- a/urcu-qsbr-static.h +++ b/urcu-qsbr-static.h @@ -222,16 +222,16 @@ static inline void _rcu_read_unlock(void) static inline void _rcu_quiescent_state(void) { long gp_ctr; - struct timeval current_time; + struct timeval current_time, delta_time; smp_mb(); gettimeofday(¤t_time, NULL); - if (current_time.tv_sec - urcu_reader_status.qs_time_last.tv_sec >= 1) + timersub(¤t_time, &urcu_reader_status.qs_time_last, &delta_time); + if (delta_time.tv_sec >= 1) _STORE_SHARED(urcu_reader_status.qs_time_delta_usec, 1000000); else _STORE_SHARED(urcu_reader_status.qs_time_delta_usec, - (unsigned long)current_time.tv_usec - - (unsigned long)urcu_reader_status.qs_time_last.tv_usec); + (unsigned long)delta_time.tv_usec); urcu_reader_status.qs_time_last = current_time; /* * volatile accesses can be reordered by the compiler when put in the @@ -259,15 +259,15 @@ static inline void _rcu_thread_offline(void) static inline void _rcu_thread_online(void) { - struct timeval current_time; + struct timeval current_time, delta_time; gettimeofday(¤t_time, NULL); - if (current_time.tv_sec - urcu_reader_status.qs_time_last.tv_sec >= 1) + timersub(¤t_time, &urcu_reader_status.qs_time_last, &delta_time); + if (delta_time.tv_sec >= 1) _STORE_SHARED(urcu_reader_status.qs_time_delta_usec, 1000000); else _STORE_SHARED(urcu_reader_status.qs_time_delta_usec, - (unsigned long)current_time.tv_usec - - (unsigned long)urcu_reader_status.qs_time_last.tv_usec); + (unsigned long)delta_time.tv_usec); urcu_reader_status.qs_time_last = current_time; _STORE_SHARED(urcu_reader_status.qs_time_delta_usec, 0); _STORE_SHARED(urcu_reader_status.qs_gp, LOAD_SHARED(urcu_gp_ctr)); diff --git a/urcu-qsbr.c b/urcu-qsbr.c index 5f06bfa..a71ee66 100644 --- a/urcu-qsbr.c +++ b/urcu-qsbr.c @@ -119,7 +119,7 @@ static void wait_for_quiescent_state(void) while (rcu_gp_ongoing(&index->urcu_reader_status->qs_gp)) { if (wait_loops++ == RCU_QS_ACTIVE_ATTEMPTS) { /* adapted wait time, in us */ - usleep(LOAD_SHARED(index->urcu_reader_status->qs_time_delta_usec)); + usleep(LOAD_SHARED(index->urcu_reader_status->qs_time_delta_usec) / 4); wait_loops = 0; } else { #ifndef HAS_INCOHERENT_CACHES -- 2.34.1