Signed-off-by: David Goulet <david.goulet@polymtl.ca>
- liburcu
Userspace RCU library, by Mathieu Desnoyers and Paul E. McKenney
- 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
* Debian/Ubuntu package: liburcu-dev
* Git : git://lttng.org/userspace-rcu.git
getopt.h sys/ipc.h sys/shm.h popt.h grp.h \
])
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.])]
# Check for pthread
AC_CHECK_LIB([pthread], [pthread_create], [],
[AC_MSG_ERROR([Cannot find libpthread. Use [LDFLAGS]=-Ldir to specify its location.])]
[AC_MSG_ERROR([Cannot find libpopt. Use [LDFLAGS]=-Ldir to specify its location.])]
)
[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 <urcu/list.h>]]
# Check liburcu needed function calls
AC_CHECK_DECL([cds_list_add], [],
[AC_MSG_ERROR([liburcu $liburcu_version or newer is needed])], [[#include <urcu/list.h>]]
AC_CHECK_DECL([rcu_thread_online], [],
[AC_MSG_ERROR([liburcu $liburcu_version or newer is needed])], [[#include <urcu.h>]]
)
AC_CHECK_DECL([rcu_thread_online], [],
[AC_MSG_ERROR([liburcu $liburcu_version or newer is needed])], [[#include <urcu.h>]]
)
+AC_CHECK_DECL([caa_likely], [],
+ [AC_MSG_ERROR([liburcu $liburcu_version or newer is needed])], [[#include <urcu.h>]]
+)
+
+# Check libust library
AC_CHECK_DECL([ustctl_create_session],
[
AC_DEFINE([CONFIG_LTTNG_TOOLS_HAVE_UST], 1)
AC_CHECK_DECL([ustctl_create_session],
[
AC_DEFINE([CONFIG_LTTNG_TOOLS_HAVE_UST], 1)
],
[[#include <ust/lttng-ust-ctl.h>]]
)
],
[[#include <ust/lttng-ust-ctl.h>]]
)
AM_CONDITIONAL([LTTNG_TOOLS_HAVE_UST], [ test "x$have_ust_test" = "x1" ])
AC_CHECK_FUNCS([sched_getcpu sysconf])
AM_CONDITIONAL([LTTNG_TOOLS_HAVE_UST], [ test "x$have_ust_test" = "x1" ])
AC_CHECK_FUNCS([sched_getcpu sysconf])
assert(split_count_mask >= 0);
cpu = sched_getcpu();
assert(split_count_mask >= 0);
cpu = sched_getcpu();
+ if (caa_unlikely(cpu < 0))
return hash & split_count_mask;
else
return cpu & split_count_mask;
return hash & split_count_mask;
else
return cpu & split_count_mask;
unsigned long split_count;
int index;
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);
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);
long count;
dbg_printf("add split count %lu\n", split_count);
unsigned long split_count;
int index;
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);
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);
long count;
dbg_printf("del split count %lu\n", split_count);
*/
assert(dummy != node);
for (;;) {
*/
assert(dummy != node);
for (;;) {
- if (unlikely(is_end(iter)))
+ if (caa_unlikely(is_end(iter)))
- 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);
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;
break;
iter_prev = clear_flag(iter);
iter = next;
iter = rcu_dereference(iter_prev->p.next);
assert(iter_prev->p.reverse_hash <= node->p.reverse_hash);
for (;;) {
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)))
- 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 */
goto insert;
/* dummy node is the first node of the identical-hash-value chain */
goto insert;
next = rcu_dereference(clear_flag(iter)->p.next);
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 */
goto gc_node;
/* uniquely add */
struct cds_lfht_node *new_next;
next = old;
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));
return -ENOENT;
if (dummy_removal)
assert(is_dummy(next));
node = rcu_dereference(dummy_node->p.next);
node = clear_flag(node);
for (;;) {
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;
}
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));
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
&& !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);
break;
}
node = clear_flag(next);
node = clear_flag(next);
for (;;) {
node = clear_flag(next);
for (;;) {
- if (unlikely(is_end(node))) {
+ if (caa_unlikely(is_end(node))) {
node = next = NULL;
break;
}
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);
node = next = NULL;
break;
}
next = rcu_dereference(node->p.next);
- if (likely(!is_removed(next))
+ if (caa_likely(!is_removed(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);
break;
}
node = clear_flag(next);
node = clear_flag(iter->next);
for (;;) {
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);
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;
}
&& !is_dummy(next)) {
break;
}
*/
void futex_nto1_wake(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);
}
uatomic_set(futex, 0);
futex_async(futex, FUTEX_WAKE, 1, NULL, NULL, 0);
}