From 6e59ae267ea128cabf21bd08fd77d5576359efb4 Mon Sep 17 00:00:00 2001 From: David Goulet Date: Thu, 3 Nov 2011 11:59:02 -0400 Subject: [PATCH] Support urcu 0.6.6 with the likely/unlikely API change Signed-off-by: David Goulet --- README | 2 +- configure.ac | 12 ++++++++---- hashtable/rculfhash.c | 44 +++++++++++++++++++++--------------------- lttng-sessiond/futex.c | 2 +- 4 files changed, 32 insertions(+), 28 deletions(-) diff --git a/README b/README index 03bc1f591..4ed9c5bed 100644 --- a/README +++ b/README @@ -13,7 +13,7 @@ REQUIREMENTS: - liburcu Userspace RCU library, by Mathieu Desnoyers and Paul E. McKenney - -> Tested with liburcu >= v0.6.5 + -> Tested with liburcu >= v0.6.6 * Debian/Ubuntu package: liburcu-dev * Git : git://lttng.org/userspace-rcu.git diff --git a/configure.ac b/configure.ac index 3ead48e7b..ac77c8222 100644 --- a/configure.ac +++ b/configure.ac @@ -16,9 +16,6 @@ AC_CHECK_HEADERS([ \ getopt.h sys/ipc.h sys/shm.h popt.h grp.h \ ]) -# URCU library version needed or newer -liburcu_version=">= 0.6.5" - # Check for pthread AC_CHECK_LIB([pthread], [pthread_create], [], [AC_MSG_ERROR([Cannot find libpthread. Use [LDFLAGS]=-Ldir to specify its location.])] @@ -29,6 +26,9 @@ AC_CHECK_LIB([popt], [poptGetContext], [], [AC_MSG_ERROR([Cannot find libpopt. Use [LDFLAGS]=-Ldir to specify its location.])] ) +# URCU library version needed or newer +liburcu_version=">= 0.6.6" + # Check liburcu needed function calls AC_CHECK_DECL([cds_list_add], [], [AC_MSG_ERROR([liburcu $liburcu_version or newer is needed])], [[#include ]] @@ -45,6 +45,11 @@ AC_CHECK_DECL([rcu_thread_offline], [], AC_CHECK_DECL([rcu_thread_online], [], [AC_MSG_ERROR([liburcu $liburcu_version or newer is needed])], [[#include ]] ) +AC_CHECK_DECL([caa_likely], [], + [AC_MSG_ERROR([liburcu $liburcu_version or newer is needed])], [[#include ]] +) + +# Check libust library AC_CHECK_DECL([ustctl_create_session], [ AC_DEFINE([CONFIG_LTTNG_TOOLS_HAVE_UST], 1) @@ -56,7 +61,6 @@ AC_CHECK_DECL([ustctl_create_session], ], [[#include ]] ) - AM_CONDITIONAL([LTTNG_TOOLS_HAVE_UST], [ test "x$have_ust_test" = "x1" ]) AC_CHECK_FUNCS([sched_getcpu sysconf]) diff --git a/hashtable/rculfhash.c b/hashtable/rculfhash.c index 27c0eeb10..2e8315314 100644 --- a/hashtable/rculfhash.c +++ b/hashtable/rculfhash.c @@ -605,7 +605,7 @@ int ht_get_split_count_index(unsigned long hash) assert(split_count_mask >= 0); cpu = sched_getcpu(); - if (unlikely(cpu < 0)) + if (caa_unlikely(cpu < 0)) return hash & split_count_mask; else return cpu & split_count_mask; @@ -624,11 +624,11 @@ void ht_count_add(struct cds_lfht *ht, unsigned long size, unsigned long hash) unsigned long split_count; int index; - if (unlikely(!ht->split_count)) + if (caa_unlikely(!ht->split_count)) return; index = ht_get_split_count_index(hash); split_count = uatomic_add_return(&ht->split_count[index].add, 1); - if (unlikely(!(split_count & ((1UL << COUNT_COMMIT_ORDER) - 1)))) { + if (caa_unlikely(!(split_count & ((1UL << COUNT_COMMIT_ORDER) - 1)))) { long count; dbg_printf("add split count %lu\n", split_count); @@ -651,11 +651,11 @@ void ht_count_del(struct cds_lfht *ht, unsigned long size, unsigned long hash) unsigned long split_count; int index; - if (unlikely(!ht->split_count)) + if (caa_unlikely(!ht->split_count)) return; index = ht_get_split_count_index(hash); split_count = uatomic_add_return(&ht->split_count[index].del, 1); - if (unlikely(!(split_count & ((1UL << COUNT_COMMIT_ORDER) - 1)))) { + if (caa_unlikely(!(split_count & ((1UL << COUNT_COMMIT_ORDER) - 1)))) { long count; dbg_printf("del split count %lu\n", split_count); @@ -807,12 +807,12 @@ void _cds_lfht_gc_bucket(struct cds_lfht_node *dummy, struct cds_lfht_node *node */ assert(dummy != node); for (;;) { - if (unlikely(is_end(iter))) + if (caa_unlikely(is_end(iter))) return; - if (likely(clear_flag(iter)->p.reverse_hash > node->p.reverse_hash)) + if (caa_likely(clear_flag(iter)->p.reverse_hash > node->p.reverse_hash)) return; next = rcu_dereference(clear_flag(iter)->p.next); - if (likely(is_removed(next))) + if (caa_likely(is_removed(next))) break; iter_prev = clear_flag(iter); iter = next; @@ -916,9 +916,9 @@ void _cds_lfht_add(struct cds_lfht *ht, iter = rcu_dereference(iter_prev->p.next); assert(iter_prev->p.reverse_hash <= node->p.reverse_hash); for (;;) { - if (unlikely(is_end(iter))) + if (caa_unlikely(is_end(iter))) goto insert; - if (likely(clear_flag(iter)->p.reverse_hash > node->p.reverse_hash)) + if (caa_likely(clear_flag(iter)->p.reverse_hash > node->p.reverse_hash)) goto insert; /* dummy node is the first node of the identical-hash-value chain */ @@ -926,7 +926,7 @@ void _cds_lfht_add(struct cds_lfht *ht, goto insert; next = rcu_dereference(clear_flag(iter)->p.next); - if (unlikely(is_removed(next))) + if (caa_unlikely(is_removed(next))) goto gc_node; /* uniquely add */ @@ -1016,7 +1016,7 @@ int _cds_lfht_del(struct cds_lfht *ht, unsigned long size, struct cds_lfht_node *new_next; next = old; - if (unlikely(is_removed(next))) + if (caa_unlikely(is_removed(next))) return -ENOENT; if (dummy_removal) assert(is_dummy(next)); @@ -1409,20 +1409,20 @@ void cds_lfht_lookup(struct cds_lfht *ht, void *key, size_t key_len, node = rcu_dereference(dummy_node->p.next); node = clear_flag(node); for (;;) { - if (unlikely(is_end(node))) { + if (caa_unlikely(is_end(node))) { node = next = NULL; break; } - if (unlikely(node->p.reverse_hash > reverse_hash)) { + if (caa_unlikely(node->p.reverse_hash > reverse_hash)) { node = next = NULL; break; } next = rcu_dereference(node->p.next); assert(node == clear_flag(node)); - if (likely(!is_removed(next)) + if (caa_likely(!is_removed(next)) && !is_dummy(next) && node->p.reverse_hash == reverse_hash - && likely(!ht->compare_fct(node->key, node->key_len, key, key_len))) { + && caa_likely(!ht->compare_fct(node->key, node->key_len, key, key_len))) { break; } node = clear_flag(next); @@ -1447,18 +1447,18 @@ void cds_lfht_next_duplicate(struct cds_lfht *ht, struct cds_lfht_iter *iter) node = clear_flag(next); for (;;) { - if (unlikely(is_end(node))) { + if (caa_unlikely(is_end(node))) { node = next = NULL; break; } - if (unlikely(node->p.reverse_hash > reverse_hash)) { + if (caa_unlikely(node->p.reverse_hash > reverse_hash)) { node = next = NULL; break; } next = rcu_dereference(node->p.next); - if (likely(!is_removed(next)) + if (caa_likely(!is_removed(next)) && !is_dummy(next) - && likely(!ht->compare_fct(node->key, node->key_len, key, key_len))) { + && caa_likely(!ht->compare_fct(node->key, node->key_len, key, key_len))) { break; } node = clear_flag(next); @@ -1474,12 +1474,12 @@ void cds_lfht_next(struct cds_lfht *ht, struct cds_lfht_iter *iter) node = clear_flag(iter->next); for (;;) { - if (unlikely(is_end(node))) { + if (caa_unlikely(is_end(node))) { node = next = NULL; break; } next = rcu_dereference(node->p.next); - if (likely(!is_removed(next)) + if (caa_likely(!is_removed(next)) && !is_dummy(next)) { break; } diff --git a/lttng-sessiond/futex.c b/lttng-sessiond/futex.c index de3f94e6e..e01771e6e 100644 --- a/lttng-sessiond/futex.c +++ b/lttng-sessiond/futex.c @@ -93,7 +93,7 @@ void futex_nto1_wait(int32_t *futex) */ void futex_nto1_wake(int32_t *futex) { - if (unlikely(uatomic_read(futex) == -1)) { + if (caa_unlikely(uatomic_read(futex) == -1)) { uatomic_set(futex, 0); futex_async(futex, FUTEX_WAKE, 1, NULL, NULL, 0); } -- 2.34.1